<?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
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
另外问问
$shm_id = shmop_open(0xff3, "c", 0644, 100);
中0xff3这个内存地址段是否有规定的?填错了会如何?
----------------------------------------------------
//序列化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校验,保证从内存中读取到数据的完整性,这种方法和上面记录长度的实现方式是一样的,不说了,自己想把
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();?>
shmop_open( int key, string flags, int mode, int size)
里面size的单位是什么啊byte/k?$shm_id = shmop_open(0xff3, "c", 0644, 1);但是往里面写长度大于1000的字符串,都可以,而且可以读出来。
$my_string = shmop_read($shm_id, 20, $len);跟$my_string = shmop_read($shm_id, 0, strlen($value));功能有什么不同
heap表是怎么实现的 能将代码发给我看看吗
这个比较方便不用自己写了。http://turck-mmcache.sourceforge.net/http://sourceforge.net/projects/turck-mmcache/