Как сохранять объекты между запросами в PHP
Я использую rails, merb, django и asp.net приложения mvc в прошлом. Что у них общего (что имеет отношение к вопросу), так это то, что у них есть код, который устанавливает структуру. Это обычно означает создание объектов и состояния, которые сохраняются до тех пор, пока веб-сервер не будет переработан (например, настройка маршрутизации или проверка доступных контроллеров и т. д.).
насколько я знаю, PHP больше похож на скрипт CGI, который компилируется в некоторый байт-код каждый раз, когда он запускается, и после запроса он отбрасывается. Конечно, у вас могут быть сеансы, чтобы сохранять данные между запросами одного и того же пользователя, и, как я вижу, есть расширения, такие как APC, с помощью которых вы можете сохранять объекты между запросами на уровне сервера.
мой вопрос: как можно создать PHP-приложение, которое работает как rails и тому подобное? Я имею в виду приложение, которое на первых запросах устанавливает фреймворк, затем на 2-м и более поздних запросах использует объекты, которые уже настроены. Быть там некоторые встроенные средства кэширования в mod_php? (например, хранит скомпилированный байт-код выполненных php-приложений) или использует APC или некоторые подобные расширения единственный способ решить эту проблему? Как бы вы это сделали?
спасибо.
EDIT: альтернативный вопрос: если я создаю большое PHP-приложение, которое имеет очень большое время настройки, но незначительное время работы (как в упомянутых выше фреймворках), то как я должен "кэшировать" вещи, которые уже настроены (это может означать много вещей, за исключением, возможно, соединений с базой данных, потому что для этого у вас уже есть постоянные соединения в PHP).
чтобы оправдать большое время настройки: что, если я использую отражение PHP, чтобы проверить, какие объекты доступны и установить время выполнения в соответствии с этим. Много рефлексии, как правило, медленно, но нужно сделать это только один раз (и пересмотреть, только если исходный код изменен).
EDIT2: кажется, это APC. Тот факт, что он кэширует байт-код автоматически полезно знать.
3 ответов
Не уверен, что APC является единственным решением, но APC заботится обо всех ваших проблемах.
во-первых, ваш скрипт будет скомпилирован один раз с APC и байт-код хранится в памяти.
Если у вас что-то занимает много времени для настройки, вы также можете кэшировать его в APC в качестве пользовательских данных. Например, я делаю это все время,
$table = @apc_fetch(TABLE_KEY);
if (!$table) {
$table = new Table(); // Take long time
apc_store(TABLE_KEY, $table);
}
С APC задача создания таблицы выполняется только один раз на экземпляр сервера.
PHP (и ruby, если на то пошло) являются интерпретирующими языками. То есть они анализируют файлы каждый раз, когда они запрашиваются, и я полагаю, вы могли бы сказать, что они преобразуются в псевдо-байтовый код. Более "очевидным" можно сказать, что PHP больше похож на это, чем сказать RoR, но они оба ведут себя одинаково.
функция сохранения данных между запросами-это функция сервера, а не самого языка. Например, маршрутизация RoR, о которой вы говорите, фактически кэшируется, но это кэшируется в локальной памяти сервера. Он не скомпилирован и сохранен для более быстрого readins. Сервер (и под сервером я подразумеваю как коробку, так и экземпляры веб-службы) перезапускает эту информацию. "Настройка фреймворка", о которой вы говорите, по-прежнему включает в себя разбор каждого файла, участвующего в фреймворке. Rails анализирует каждый файл во время запроса снова и снова, функции производственного уровня могут фактически кэшировать эти данные в памяти, но, конечно, в разработке это не так. Единственная причина, по которой я упоминаю это потому, что он иллюстрирует, что это функция сервера, а не язык.
для достижения того же самого в PHP вы можете использовать Zend Server. Насколько я знаю, это единственный интерпретатор PHP, который будет "компилировать" и использовать байтовый код, когда ему скажут. В противном случае вам нужно будет найти способ хранения данных, которые вы хотите сохранить по запросам. APC, как вы упомянули, очень мощная функция, более распространенная-Memcached, а затем, конечно, есть более постоянные формы, такие как disc & язык SQL.
Мне интересно узнать, почему вам нравится эта конкретная функция. Вы замечаете проблемы с производительностью, которые будут "решены", сделав это?
Я думаю, что вы делаете неверные обобщения. Все эти рамки (например: рейлинги) может работать с различными конфигурациями. В некоторых случаях для каждого запроса создается процесс. Это, очевидно, вредит производительности, но показывает, что эти структуры не полагаются на длительный процесс. Они могут настраивать вещи (повторно просматривать файлы конфигурации,создавать объекты и т. д.) каждый запрос при необходимости.
конечно, mod_php (как обычно используется PHP) работает внутри процесс веб-сервера, в отличие от CGI. Поэтому я не вижу ничего принципиально отличного между CakePHP (например) и Rails.
Я думаю, возможно, вы ищете что-то вроде Python WSGI или Руби шкафа, но для PHP. Это определяет интерфейс (независимо от того, как выполняется язык) для приложения. Для нового запроса создается новый экземпляр объекта application. Насколько я знаю, это не существует для PHP.