1

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)。

4

2 回答 2

1

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

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

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

于 2012-04-04T03:02:55.333 回答
0

zend_object 不能持久,因此你不能这样做。像 APC 这样的扩展将对象序列化到内存中。

于 2015-09-05T07:49:17.177 回答