Вопрос

Я использовал Rails, Merb, Django и ASP.NET MVC в прошлом. То, что они имеют общие (это отношение к вопросу), заключается в том, что у них есть код, который устанавливает рамки. Это обычно означает создание объектов и состояния, которое сохраняется до тех пор, пока веб-сервер будет переработан (например, настройка маршрутизации или проверки, какие контроллеры доступны и т. Д.).

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

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

Спасибо.

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

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

Редактировать2: кажется, что это APC тогда. Тот факт, что он кэширует Bytecode автоматически, это приятно знать.

Это было полезно?

Решение

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

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

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

            $table = @apc_fetch(TABLE_KEY);

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

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

Другие советы

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

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

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

Я заинтересован в том, чтобы знать, почему вы хотели бы иметь эту особенность. Вы замечаете проблемы с производительностью, которые были бы «решены», делая это?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top