Как создать общий объект между разными сеансами в PHP?

Как создать общий объект между разными сеансами в PHP?

Я думаю об использовании файла или таблицы памяти MySQL. Использование файла не является хорошим вариантом, поскольку оно не имеет блокировки и работает медленно. Использование таблицы памяти MySQL — хороший вариант, но как сохранить экземпляры классов (объекты) в таблицу? Сериализация объекта и размещение его в таблице также происходит медленно.

Option 1: MySQL memory table
Option 2: shm_attach,shm_detach,shm_get_var,shm_has_var,shm_put_var,..
Option 3: Memcache

Проблема заключается в том, что для использования таблицы памяти MySQL требуется запрос. Memcache не включен в стандартную установку PHP. Чтобы иметь функции shm_* в Windows, необходимо получить PHP, собранный из исходного кода с опцией «--enable-sysvsem», и для этого требуется настройка в php.ini, к которой разработчик может не иметь доступа все время.

Какой из вышеперечисленных лучше? Любые другие варианты?


person jondinham    schedule 17.11.2011    source источник
comment
Общая память — это один из вариантов: php.net/manual/en/function. shm-get-var.php   -  person Marc B    schedule 17.11.2011
comment
О каких данных вы говорите? как выглядит этот объект?   -  person Manse    schedule 17.11.2011
comment
это экземпляр класса с многоуровневой структурой (аналогично многоуровневому массиву)   -  person jondinham    schedule 17.11.2011
comment
json_encode затем сохранить в MySQL?   -  person Manse    schedule 17.11.2011
comment
все известные мне варианты требуют сериализации. Если это то, чего вы пытаетесь избежать, дайте мне знать, когда вы найдете способ избежать этого :P   -  person MicronXD    schedule 17.11.2011
comment
@ManseUK Я думаю, что json_encoding медленнее, чем сериализация php ... но я могу ошибаться.   -  person MicronXD    schedule 17.11.2011
comment
@MicronXD у каждого есть свои плюсы и минусы – › stackoverflow.com/questions/804045/   -  person Manse    schedule 17.11.2011
comment
@MarcB я вижу, что эти функции семафора php применимы только к System V?   -  person jondinham    schedule 17.11.2011
comment
@ManseUK Ого! json_encode на самом деле быстрее! KyleFarris протестировал и обнаружил увеличение скорости на 100 % при использовании json_encode и увеличение на 20 % при использовании json_decode по сравнению с сериализацией и десериализацией соответственно. Спасибо, что просветили меня, ManseUK!   -  person MicronXD    schedule 17.11.2011
comment
json_encode/json_decode не могут иметь дело с конкретными классами, а только с объектами типа stdClass. И есть некоторые другие неподдерживаемые переменные функции с json, о которых позаботится searialize. Вероятно, поэтому он быстрее (я сомневаюсь, что такая скорость действительно имеет значение в вашем случае).   -  person hakre    schedule 17.11.2011


Ответы (4)


Если вы хотите совместно использовать объекты (экземпляры классов) между различными процессами, вы всегда будете привязаны к serialize и unserialize, независимо от того, какой уровень хранения вы используете (база данных, память, файлы, ...).

Если вы не хотите использовать serialize и unserialize, вы мало что можете сделать.

person hakre    schedule 17.11.2011
comment
Marc B предложил использовать семафорные функции php shm_*, но для этого требуется передать параметр в php.exe. это то, что я могу делать на своем ПК, но не на моем сервере виртуального хостинга. я сейчас совсем запутался - person jondinham; 17.11.2011
comment
@JonDinham, даже если вы используете файлы, вам нужно сначала сериализовать данные, не так ли? - person Pacerier; 18.10.2014

Помню, видел похожую проблему с решением в разработке eyeOS.

Я знаю, что вы не совсем в восторге от использования файла, но что, если бы вы сохранили переменные, которыми хотите поделиться, в формате xml.

Если вы хотите, чтобы он был специфичен для определенных сеансов, вы можете использовать уникальные токены (своего рода пароль) для каждого набора сеансов и настроить контроллер, который направляет запросы в правильный xml-файл сеанса на основе токена.

В целях безопасности вы можете хранить информацию xml в файле php и разрешать извлечение информации только с помощью POST с использованием правильного токена.

Этот метод позволит вам безопасно получать доступ, редактировать и удалять (уничтожать) общие сеансы.

person Shattuck    schedule 17.11.2011

Memcache не входит в стандартную установку PHP. Функции семафора и общей памяти не поддерживаются в Windows.

Скорее всего, единственным решением является использование таблицы памяти MySQL с сериализацией объектов.

person jondinham    schedule 17.11.2011

Я не вижу упоминания apc:

http://www.php.net/manual/en/book.apc.php

Не уверен, что это за один сеанс, так как в руководстве отсутствует информация о том, что он делает, но в других сообщениях я вижу альтернативу memcache.

Я ищу simular решение для хранения шаблонов страниц, которые, возможно, придется использовать много, и хранения аутентифицированных пользователей в таблице в памяти вместо использования сеанса php (вторая часть, в которой я не уверен).

person HMR    schedule 22.11.2012