<?php//定义类
class test
{
   var $num = '';   function show()
   {
   echo $this->num;
   }
}//申请共享内存空间
$shm_id = shmop_open(0xff3, "c", 0644, 100);//实例化test对象
$exam = new test();
$exam->num = 'ok';//序列化test对象
$value = serialize($exam);//写入共享内存空间
shmop_write($shm_id, $value, 0);//获取共享内存空间中的内容
$my_string = shmop_read($shm_id, 0, strlen($value));//反序列化
$haha = unserialize($my_string);//输出test对象的num成员值
echo $haha->num;//释放共享内存空间
shmop_delete($shm_id);
shmop_close($shm_id);?>更详细描述请参考php manual

解决方案 »

  1.   

    好东西,收藏收藏
    另外问问
    $shm_id = shmop_open(0xff3, "c", 0644, 100);
    中0xff3这个内存地址段是否有规定的?填错了会如何?
      

  2.   

    int shmop_open ( int key, string flags, int mode, int size)key, which is the system's id for the shared memory block, this parameter can be passed as a decimal or hex.标识而已
      

  3.   

    注意:序列化是可以的,但是如果你序列化的那个类中的某个参数是一个class对象时,反序列后好像就不能还原这个被引用的class了,(这是以前在一篇文章上看的,我一直没有验证过,不过这可以是牛人说的),所以最好是序列化数据不要序列化类,而且反序列化也挺费时间的。其他的情况下,倒是没问题。********************************************to:unixdotnet(),你的方法不全对露了一个地方,呵呵,strlen($value)这地方有错误,客户端不知道$value的值,怎么能知道strlen($value)呢??第一个用户创建了,第二个用户根本就用不了!!!!。下面的地方要改:
    ----------------------------------------------------
    //序列化test对象
    $value = serialize($exam);
    //写入共享内存空间
    shmop_write($shm_id, $value, 0);
    //获取共享内存空间中的内容
    $my_string = shmop_read($shm_id, 0, strlen($value));
    //反序列化
    $haha = unserialize($my_string);
    ----------------------------------------------------
    改成
    -------------------------------------------------
    //序列化test对象
    $value = serialize($exam);
    //写入共享内存空间
    $len = strlen($value);
    $len = str_pad($len, 20, "0", STR_PAD_RIGHT); 
    shmop_write($shm_id, $len.$value, 0);
    //获取共享内存空间中的内容
    $len = (int)shmop_read($shm_id, 0, 20);
    $my_string = shmop_read($shm_id, 20, $len);
    //反序列化
    $haha = unserialize($my_string);-----------------------------------------------------------这同时还存在一个问题,就是存取错误校验的问题,最好再加上crc或md5校验,保证从内存中读取到数据的完整性,这种方法和上面记录长度的实现方式是一样的,不说了,自己想把
      

  4.   

    1、反序列化时,要注意在程序中包含类的定义。否则得到的只是一个没有方法的只读对象
    2、一直都说共享内存有溢出漏洞,不知现在如何了。没有了linux环境无法测试
    3、“但是如果你序列化的那个类中的某个参数是一个class对象时,反序列后好像就不能还原这个被引用的class了”这样说是错误的。只要有类定义就可以的为测试方便,同时也为win32下的朋友。测试程序中用文件保存序列化后的内容。
    <?
    class A {
      var $value = 1;
      function get() {
        return $this->value;
      }
    }class B {
      var $value = 2;
      var $obj;
      function B() {
        $this->obj = new A();
      }
      function get() {
        return $this->value;
      }
    }
    /* 第一次运行时去掉注释
    $v = new B();
    echo $v->obj->get();
    echo $v->get();$s = serialize($v);$fp = fopen("ttt","w");
    fwrite($fp,$s);
    fclose($fp);
    */$ss = file_get_contents("ttt");$a = unserialize($ss);
    echo $a->obj->get();
    echo $a->get();?>
      

  5.   

    谁能告诉我
    shmop_open( int key, string flags, int mode, int size)
    里面size的单位是什么啊byte/k?$shm_id = shmop_open(0xff3, "c", 0644, 1);但是往里面写长度大于1000的字符串,都可以,而且可以读出来。
      

  6.   

    The last parameter is size of the shared memory block you wish to create in bytes
      

  7.   

    $len = strlen($value);
    $my_string = shmop_read($shm_id, 20, $len);跟$my_string = shmop_read($shm_id, 0, strlen($value));功能有什么不同
      

  8.   

    前两天写的一个项目最初是用共享内存写的。后来发现在读取时会造成apache死掉,不知道是否是溢出引起的。但个人感觉不是很爽,后来改成用heap表来做了。
      

  9.   

    我是一个用户要从内存中读取$mystring,之前有$value吗????答案是没有,如果事前知道了$value值,那还用序列???在从内存中读$mystring时,$value根本就不存在!!!!!!!
      

  10.   

    to:ustb
    heap表是怎么实现的  能将代码发给我看看吗
      

  11.   

    可以用 turck-mmcache
    这个比较方便不用自己写了。http://turck-mmcache.sourceforge.net/http://sourceforge.net/projects/turck-mmcache/