Как сохранить объекты между запросами в PHP - PullRequest
17 голосов
/ 31 мая 2010

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

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

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

Спасибо.

РЕДАКТИРОВАТЬ: Альтернативный вопрос: если я создаю большое PHP-приложение, которое имеет очень большое время настройки, но незначительное время выполнения (как в вышеупомянутых инфраструктурах), то как мне «кэшировать» уже настроенные вещи (это может означать много вещей, за исключением, может быть, соединений с базой данных, потому что для этого у вас уже есть постоянные соединения в PHP).

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

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

Ответы [ 3 ]

5 голосов
/ 31 мая 2010

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

Сначала ваш скрипт будет скомпилирован один раз с APC, а байт-код сохранен в памяти.

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

            $table = @apc_fetch(TABLE_KEY);

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

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

3 голосов
/ 31 мая 2010

PHP (и рубин в этом отношении) являются интерпретирующими языками.То есть они анализируют файлы каждый раз, когда их запрашивают, и я полагаю, что вы можете сказать, что они преобразуются в псевдобайтовый код.Более «очевидно» можно сказать, что PHP больше похож на это, чем, скажем, RoR, но они оба ведут себя одинаково.

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

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

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

0 голосов
/ 31 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...