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