Хранение объектов между запросами в PHP без сериализации



Я пишу веб-приложение с отслеживанием состояния на PHP, в котором состояние потенциально содержит множество объектов. В данный момент я храню все эти объекты в $_SESSION и сериализую их в конце запроса. Это немного больно, потому что сериализация всего сеанса занимает секунды, а несериализация занимает еще больше времени.



Я хотел попробовать APC, потому что я надеялся, что объекты тогда просто запоминаются, а не сериализуются. Увы, кажется, что если меня кормить apc_store($object) объект, кажется, сериализует его в любом случае, прежде чем передать его другому процессу. (История гласит, что примитивные значения и массивы запоминаются без сериализации, но это не является для меня подходящим решением, поскольку мои объекты сеанса имеют много (циклических) ссылок.)



Мой вопрос: существует ли известный способ сохранения объектов постоянными в PHP без необходимости сериализации их после каждого запроса? Я слышал слухи, что переводчик HipHop может помочь в этом, но я не нашел ни одного рабочего примера в сети. Может кто-нибудь сказать мне, возможно ли это вообще в PHP?



(я знаю, что должен писать этот проект на Java или другом языке, который поддерживает постоянные экземпляры без TCP-соединения)

600   2  

2 ответов:

Всякий раз, когда вам нужно сохранить (заморозить) объект, он должен быть сериализован. Это не зависит от хранилища (APC, файлов сеансов, базы данных и т. д.), это потому, что процесс сценария завершится, и в следующий раз, когда он начнется, объекты должны снова ожить.

Таким образом, вещи не могут храниться в "состоянии выполнения", объекты всегда будут сериализованы для хранения.

Известно, что сериализация PHP не самая быстрая. Существуют альтернативные реализации, которые вы можете использовать, например: пример igbinary PHP расширение. Он предлагает функцию сериализации / десериализации рядом с прозрачной обработкой сеанса. Возможно, это действительно полезно для вашего сценария.

В любом случае: чем больше вы храните внутри сеанса, тем больше вам нужно разморозить или разбудить в начале запроса, тем больше времени это займет.

Related: Что такое обработчик сериализации php_binary?

В моем веб-приложении statefull я выгружаю большинство своих объектов в хранилище xml, которое также действует как умный xml конфигурации. Поэтому мне не нужно сериализовать слишком много объектов, а только подмножество (состояние) моего xml-файла. Это все еще серверный подход, но вы можете попробовать разгрузить сериализацию на клиент? Но, может быть, вы сериализуете слишком много объектов? И почему бы не сохранить объект в файле во время выполнения?

Comments

    Ничего не найдено.