我用的是php+mysql+linux 环境,页面上调数据都是直接用函数查数据库数据的,现导致页面好慢,
我在网上看到 把数据放到内存中去操作,这种思路详细情况是怎么样的,怎么实现呀,thanks

解决方案 »

  1.   

    把数据放到内存中有很多中方法,常见的是在服务器端使用memcache
    当然了,Mysql 也支持完全内存的存储引擎memory
    另外还有一些基于内存的数据库,不过这些都只是随机访问,一旦重启或掉电也就没了,除非楼主不希望把数据持久化。
      

  2.   

    memcache或者用缓存技术
    缓存技术:
    如文件缓存、数据库缓存
    文件缓存不说了
    数据库缓存:
    将整个流程(或页面)所需要的所有数据查出放到一个字段里(或表里),这样就不会出现多次查询数据库的情况了(只需查一次),你可以设置缓存时间
      

  3.   

    php有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上–enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。 
    这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。一、System V的共享内存使用:
     <?php
      // 创建内存块
      $key = 12345; // 共享内存的key,注:类型为int
      $memsize = 100; // 共享内存的大小,单位byte
      $perm = 0666; // 共享内存访问权限,参考linux的权限
      $var_key = 345; // 共享内存的某变量的key,注:类型为int
      $shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存
      shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"
      shm_detach( $shmid ); // 关闭共享内存
     ?>
     运行上面的php程序可以创建一个key为12345的共享内存,大小为100字节,里面有个值为“abc”的变量。在linux命令行敲入ipcs可以看到创建的共享内存信息:
     —— Shared Memory Segments ——–
     key            shmid        owner         perms        bytes        nattch       status     
     0×00003039     262144       daemon         666          100             0              
     注:0×00003039就是12345的16进制形式。 访问新创建的共享内存并删除这个共享内存的PHP代码:
     <?php
      // 读取内存块内容
      $shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
      echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc
      shm_remove( $shmid ); // 删除该共享内存
     ?>
     运行上面这个php代码,将显示abc,并把共享内存删除,这时候再运行ipcs就可以看到那块共享内存已经不存在了。二、shmop的共享内存使用:
     <?php
      // 创建内存块
      $key = 12345; // 共享内存的key
      $memsize = 100; // 共享内存的大小,单位byte
      $perm = 0666; // 共享内存访问权限,参考linux的权限
      $offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址
      $shmid = shmop_open($key, "c", $perm, $memsize); // 创建一个共享内存,第二个参数c表示创建
      $shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"写入共享内存
      echo $shm_bytes_written; // 打印出写入共享内存的数据长度,这里将显示3
      shmop_close($shm_id); // 关闭共享内存
     ?>
     运行这个php将创建一个key为12345,大小为100字节的共享内存,里面写入了”abc”这个字符串。我们在写一个访问这个共享内存的php:
     <?php
      // 读取内存块
      $shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0
      $shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址
      echo $shm_data; // 打印出上个函数返回的共享内存数据
      shmop_delete($shm_id); // 删除共享内存
     ?>
     运行这个php将打印出abc,并把原来的共享内存删除。总结:
    1. 这两套函数都是简单易用的,shmop的唯一好处是可以在windows下使用,在linux下的话推荐使用shm_*那套函数,因为那套函数在插入、更新以及读取共享内存里面的变量相当方便,而shmop需要自己来规划共享内存的存储结构,应用起来稍微复杂一点。此外,上面的例子里面我直接用数字12345作为共享内存的key,实际上,更为标准的做法是使用ftok函数来把一个路径转成ipc的key。具体做法可以参考php手册。
    2. 在使用shmop时,如果使用完成后没有进行shmop_delete()操作,则下次对共享内存变量值的写入会有问题出现,如果前次写入的长度〉下次写入的长度,则只覆盖前面的,多余的内容保留。反之,如果前次写入的长度〈下次写入的长度,则多余的内容会自动追加到后面。
    3. 共享内存时需要的key及变量均为int类型。=================================
    相关方法介绍:
    shm_attach
    打开建立共享内存空间。
    语法: int shm_attach(int key, int [memsize], int [perm]);
    返回值: 整数
    函数种类: 操作系统与环境
    内容说明: 本函数用来打开或者建立共享内存空间。参数 key 为这部分的键。参数 memsize 可省略,表示所需最小的内存空间 (单位为 byte 位组),默认值在 php3.ini 或 php.ini 中的 sysvshm.init_mem 配置,若无配置则为 10000 bytes。参数 perm 亦可省略,为该内存空间的使用权限,默认值为 666。返回值为共享内存的ID 值,可供程序使用。shm_detach
    中止共享内存空间链接。
    语法: int shm_detach(int shm_identifier);
    返回值: 整数
    函数种类: 操作系统与环境
    内容说明: 本函数用来中止与共享内存空间的链接。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。shm_remove
    清除内存空间。
    语法: int shm_remove(int shm_identifier);
    返回值: 整数
    函数种类: 操作系统与环境
    内容说明: 本函数用来清除共享内存空间的所有资料。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。shm_put_var
    加入或更新内存空间中的变量。
    语法: int shm_put_var(int shm_identifier, int variable_key, mixed variable);
    返回值: 整数
    函数种类: 操作系统与环境
    内容说明: 本函数可用来增加或者修改内存空间中变量值。参数 shm_identifier 为欲增加修改的共享内存 ID 值。参数 variable_key 为欲增加修改的变量名称键。参数 variable 为变量的内容,变量的类型可以是倍精确数 (double)、整数 (integer)、字符串 (string) 或者是数组 (array)。shm_get_var
    取得内存空间中指定的变量。
    语法: mixed shm_get_var(int shm_identifier, int variable_key);
    返回值: 混合类型资料
    函数种类: 操作系统与环境
    内容说明: 本函数可用来取得内存空间中指定的变量值。参数 shm_identifier 为欲取得的共享内存 ID 值。参数 variable_key 为欲取得的变量名称键。返回值即为指定变量键的值。shm_remove_var
    删除内存空间中指定的变量。
    语法: int shm_remove_var(int id, int variable_key);
    返回值: 整数
    函数种类: 操作系统与环境
    内容说明: 本函数可用来删除内存空间中指定的变量值。参数 shm_identifier 为欲除去的共享内存 ID 值。参数 variable_key 为欲删除的变量名称键。
      

  4.   

    楼主发的东西不错,只不过一般都用mamcache了
      

  5.   

    想请教下楼主–enable-shmop在安装php的时候在那块,没注意过,还有能不能在安装完后再设置呢?
      

  6.   

    回九楼的,linux系统中默认就设置好了的