这样效率会比include一个保存有数组词典的文件高很多么?
我觉得如果可以保存到内容,至少不用每次都去读文件了,这个词典有几十兆的。

解决方案 »

  1.   

    上M的文件就不能include了,太耗费时间,帮你顶,保存到内存是个不错的选择,但是担心内存会不会被耗尽啊
      

  2.   

    我想这样,在一开始的时候检查内存中是否有这个词库,如果没有就创建一个。
    以后每次需要使用词库的时候就重复上面的步骤。另外有点不明白的地方,是不是每次使用都要把词库先完全从内存中读取出来?这样效率怎么样?
    //获取共享内存空间中的前10兆个字节的内容,假设词典10兆
    $share = shmop_read($shm_id, 0, 10485760);另外
    //申请10兆字节共享内存空间
    $shm_id = shmop_open(0xff3, "c", 0644, 10485760);
    内存空间会不会有限制呀?服务器1G的内存,呵呵,我对操作内存操作一窍不通的。
      

  3.   

    1.php<?php
    $words=array('aaa','bbb','ccc','ddd');
    //申请共享内存空间
    $shm_id = shmop_open(0xff3, "c", 0644, 10485760);
    //序列化
    $value = serialize($words);//写入共享内存空间
    shmop_write($shm_id, $value, 0);//获取共享内存空间中的内容
    $my_string = shmop_read($shm_id, 0, strlen($value));
    shmop_close($shm_id);
    ?>2.php<?php//申请共享内存空间
    $shm_id = shmop_open(0xff3, "c", 0644, 10485760);//获取共享内存空间中的内容
    $my_string = shmop_read($shm_id, 0, 10485760);//反序列化
    $words = unserialize($my_string);//输出test对象的num成员值
    print_r(words);
    ?>
    先执行1.php
    后执行2.php2.php和1.php可以不在一个会话中服务器restart后共享内存内容才会消失
      

  4.   

    好象Unix下,有内存限制
    以上程序在windows下没问题
      

  5.   

    在linux下可以用tmpfs或虚拟磁盘试试。java cup的办法是win linux通用的,不过据说速度有点慢。
      

  6.   

    love01px 你好,我试了你的程序先运行的1.php,然后运行2.php,2.php中的$words内容为空呀。运行环境
    win2003    php 5.1.2
      

  7.   

    是啊,他的程序运行报错:
    Fatal error: Call to undefined function: shmop_open()
      

  8.   

    共享内存不能使用CGI模式,只能用于ISAPI模式。
    还要在PHP.ini中打开 extension=php_shmop.dll 才能使用。
    你也可以试试使用虚拟磁盘,把内存划一块出来做磁盘嘛。
      

  9.   

    我打开了php_shmop.dll,估计是因为php使用GCI模式才不能使用的。如果使用虚拟磁盘的话,那就直接include词库,效率应该和内存一样的吧?
      

  10.   

    使用类似Discuz,跟据IP判断地址的方式。把数据按一定规律整理并存放到文件,调用时计算行数,直接读文件的第N行。
      

  11.   

    不要使用php的共享内存函数。
    1、因为在linux和win32中的内存管理机制不同,因此php也需要使用不同的扩展库来操作。
    2、php的共享内存函数功能较弱,只能整块的读取和写入使用序列化数据的方法并不可取
    1、对于数组,serialize后的串比var_export得到串要大近一倍。这样很不划算
    2、unserialize是在php有限内存(默认8m)中进行的,对于数兆的数据的反序列话很困难对于较大的字典数据应保存为定长记录文件。
    在一个已排序的定长记录文件中用文件函数查找记录是很快的,所以没有必要加载到内存。
    为了加快文件的读取,你还可以把文件放入内存驱动器