Сделать ZVAL постоянным в SAPI?
ZVAL обычно создается с помощью emalloc, поэтому он уничтожается в конце запроса страницы. Есть ли способ взять существующий ZVAL и сохранить его в SAPI (эквивалент pemalloc)? Как насчет создания ZVAL с pemalloc?
В идеале то, что я хотел бы сделать (в коде PHP) это:
class Object
{
public $foo;
}
if(!($object = persist("object")))
{
$object = persist("object", new Object());
}
$object->foo[] = "bar";
print count($object->foo);
На каждый запрос count
вернул бы +1 (при условии, что каждый раз используется один и тот же "рабочий" PHP - я использую PHP-FPM).
2 ответа
Вы в основном описываете 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()
Первый параметр
zend_object не может быть постоянным, поэтому вы не можете этого сделать. расширения, такие как APC, сериализуют объект в память.