使ZVAL在SAPI中持久存在?

时间:2012-04-03 22:28:53

标签: php-extension php-internals

ZVAL通常使用emalloc创建,因此在页面请求结束时会被销毁。有没有办法获取现有的ZVAL并使其在SAPI中持久存在(相当于pemalloc)?用pemalloc创建ZVAL怎么样?

理想情况下,我想做的是(在PHP代码中):

class Object
{
    public $foo;
}

if(!($object = persist("object")))
{
   $object = persist("object", new Object());
}

$object->foo[] = "bar";

print count($object->foo);

在每个请求count上都会返回+1(假设每次都使用相同的PHP“worker” - 我正在使用PHP-FPM。)

2 个答案:

答案 0 :(得分:1)

您基本上是在描述http://lxr.php.net/opengrok/xref/PHP_5_3/ext/sysvshm/sysvshm.c#242

在没有重复已经存在的功能的情况下,您可以获得的最接近的是https://github.com/flavius/php-persist。问题:在prefork /多进程SAPI(如apache)中,来自同一客户端的不同请求可能会在不同的进程中结束,因此,您将看到不同的数据(在Linux + Firefox上尝试每次都进行硬刷新在浏览器中。)

注意:这是一项正在进行中的工作,目前只保留一个整数。添加数组应该是微不足道的。补丁欢迎。它仍然需要反序列化部分,并实际使用persist()的第一个参数。

答案 1 :(得分:0)

zend_object不能坚持不懈,因此你无法做到这一点。像APC这样的扩展将对象序列化为内存。