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

Я использовал направляющие, merb, django и asp.net mvc приложения в прошлом. То, что они имеют распространенный (который относится к вопросу), - то, что у них есть код, который настраивает платформу. Это обычно означает создавать объекты, и заявите, что это сохраняется, пока веб-сервер не переработан (как установка маршрутизации или проверка, какие контроллеры доступны, и т.д.).

Насколько я знаю, что PHP больше похож на сценарий CGI, который компилируется в некоторый байт-код каждый раз, когда он выполняется, и после запроса, он отбрасывается. Конечно, у Вас могут быть сессии, для сохранения данных между запросами от того же пользователя, и поскольку я вижу, что существуют расширения как APC, с которым можно сохранить объекты между запросами на уровне сервера.

Мой вопрос: как можно создать приложение PHP, которое работает как направляющие и такой? Я имею в виду приложение, которое по первым запросам настраивает платформу, затем по 2-му и более позднему использованию запросов объекты, которые уже настраиваются. Разве существуют ли некоторые созданные в кэширующемся средстве в mod_php? (например, который хранит скомпилированный байт-код выполняемых php приложений), Или использует APC или некоторые подобные расширения единственный способ решить эту проблему? Как Вы сделали бы это?

Спасибо.

Править: Альтернативный вопрос: если я создаю большое приложение PHP, которое имеет очень большой набор время, но незначительное время выполнения (как в упомянутых выше платформах) затем, как я должен "кэшировать" вещи, которые уже настраиваются (это могло бы означать много вещей, за исключением, возможно, соединений с базой данных, потому что для этого у Вас уже есть постоянные соединения в PHP).

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

EDIT2: кажется, что это - APC затем. То, что это кэширует байт-код автоматически, хорошо знать.

17
задан SztupY 31 May 2010 в 06:40
поделиться

3 ответа

Не уверен, что APC является единственным решением, но APC действительно решает все ваши проблемы.

Во-первых, ваш скрипт будет скомпилирован один раз с помощью APC, а байткод будет храниться в памяти.

Если у вас есть что-то, требующее много времени на установку, вы также можете кэшировать это в APC как пользовательские данные. Например, я делаю это постоянно,

            $table = @apc_fetch(TABLE_KEY);

            if (!$table) {
                    $table = new Table(); // Take long time
                    apc_store(TABLE_KEY, $table);
            }

С APC задача создания таблицы выполняется только один раз для каждого экземпляра сервера.

5
ответ дан 30 November 2019 в 14:41
поделиться

PHP (и ruby, если на то пошло) являются интерпретируемыми языками. То есть они разбирают файлы при каждом запросе и, полагаю, можно сказать, что они преобразуются в псевдобайтовый код. Можно сказать, что PHP более "очевиден", чем RoR, но оба они ведут себя одинаково.

Особенность сохранения данных между запросами - это особенность сервера, а не самого языка. Например, маршрутизация RoR, о которой вы говорите, на самом деле кэшируется, но это кэширование происходит в локальной памяти сервера. Она не компилируется и не сохраняется для более быстрого чтения. При перезапуске сервера (а под сервером я подразумеваю и блок, и экземпляры веб-сервиса) эта информация исчезает. Настройка фреймворка", о которой вы говорите, все еще включает разбор КАЖДОГО файла, задействованного во фреймворке. Rails разбирает каждый файл во время запроса снова и снова, функции производственного уровня могут фактически кэшировать эти данные в памяти, но, конечно, в разработке этого не происходит. Я упоминаю об этом только потому, что это иллюстрация того, что это особенность сервера, а не языка.

Чтобы добиться того же самого в PHP, вы можете использовать Zend Server. Насколько я знаю, это единственный интерпретатор PHP, который "компилирует" и использует байт-код, когда ему говорят об этом. В противном случае вам придется найти способ хранения данных, которые вы хотите сохранять при запросах. APC, как вы упомянули, является очень мощной функцией, более распределенной является Memcached, а затем, конечно, есть более постоянные формы, такие как диск и sql.

Мне интересно знать, почему вам нужна именно эта функция. Вы замечаете проблемы с производительностью, которые будут "решены" этим?

3
ответ дан 30 November 2019 в 14:41
поделиться

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

Конечно, mod_php (способ, которым обычно используется PHP) работает внутри процесса веб-сервера, в отличие от CGI. Так что я не вижу ничего принципиально различного между CakePHP (например) и Rails.

Я думаю, возможно, вы ищете что-то вроде WSGI от Python или Rack от Ruby, но для PHP. Это определяет интерфейс (не зависящий от того, как выполняется язык) для приложения. Для нового запроса создается новый экземпляр объекта приложения. Насколько я знаю, для PHP такого интерфейса не существует.

0
ответ дан 30 November 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: