Хранение объектов между запросами в PHP без сериализации
Я пишу веб-приложение с отслеживанием состояния на PHP, в котором состояние потенциально содержит множество объектов. В данный момент я храню все эти объекты в $_SESSION и сериализую их в конце запроса. Это немного больно, потому что сериализация всего сеанса занимает секунды, а несериализация занимает еще больше времени.
Я хотел попробовать APC, потому что я надеялся, что объекты тогда просто запоминаются, а не сериализуются. Увы, кажется, что если меня кормить apc_store($object) объект, кажется, сериализует его в любом случае, прежде чем передать его другому процессу. (История гласит, что примитивные значения и массивы запоминаются без сериализации, но это не является для меня подходящим решением, поскольку мои объекты сеанса имеют много (циклических) ссылок.)
Мой вопрос: существует ли известный способ сохранения объектов постоянными в PHP без необходимости сериализации их после каждого запроса? Я слышал слухи, что переводчик HipHop может помочь в этом, но я не нашел ни одного рабочего примера в сети. Может кто-нибудь сказать мне, возможно ли это вообще в PHP?
(я знаю, что должен писать этот проект на Java или другом языке, который поддерживает постоянные экземпляры без TCP-соединения)
2 ответов:
Всякий раз, когда вам нужно сохранить (заморозить) объект, он должен быть сериализован. Это не зависит от хранилища (APC, файлов сеансов, базы данных и т. д.), это потому, что процесс сценария завершится, и в следующий раз, когда он начнется, объекты должны снова ожить.
Таким образом, вещи не могут храниться в "состоянии выполнения", объекты всегда будут сериализованы для хранения.
Известно, что сериализация PHP не самая быстрая. Существуют альтернативные реализации, которые вы можете использовать, например: пример
igbinaryPHP расширение. Он предлагает функцию сериализации / десериализации рядом с прозрачной обработкой сеанса. Возможно, это действительно полезно для вашего сценария.В любом случае: чем больше вы храните внутри сеанса, тем больше вам нужно разморозить или разбудить в начале запроса, тем больше времени это займет.
В моем веб-приложении statefull я выгружаю большинство своих объектов в хранилище xml, которое также действует как умный xml конфигурации. Поэтому мне не нужно сериализовать слишком много объектов, а только подмножество (состояние) моего xml-файла. Это все еще серверный подход, но вы можете попробовать разгрузить сериализацию на клиент? Но, может быть, вы сериализуете слишком много объектов? И почему бы не сохранить объект в файле во время выполнения?
Comments