Подтвердить что ты не робот

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

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

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

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

Спасибо.

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

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

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

4b9b3361

Ответ 1

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

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

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

            $table = @apc_fetch(TABLE_KEY);

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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