PHP: загрузить набор свойств (из файлов конфигурации) только ОДИН РАЗ для всех пользовательских запросов - PullRequest
2 голосов
/ 13 марта 2011

У меня есть файл, который содержит специфические свойства приложения (например, время ожидания и т. Д.), Который я поместил в файл свойств my_app.ini и который я прочитал, используя parse_ini_file().

Как / где я должен заставить этот код запускаться ровно один раз для всех моих пользовательских запросов (я не хочу, чтобы мое приложение считывало файл .ini при каждом запросе)?

Хотя я поместил код чтения файла конфигурации в отдельный PHP и включил его с include_once / require_once на всех страницах, где требуется доступ к переменным конфигурации. Но:

  1. Будет ли это означать, что файл будет прочитайте один раз для каждой отдельной страницы (так разные времена, так как у меня есть несколько страниц с require_once('config_setup.php'))
  2. Is require_once / include_once выполняется только один раз для всех пользователей запросы?

Меня интересует возможность услышать другие (лучшие) способы, как это сделать.

Ответы [ 3 ]

8 голосов
/ 13 марта 2011

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

Однако вы можете использовать такие расширения, как APC или Memcache / Memcached для хранения переменных в памяти. Эти расширения необходимо скомпилировать / установить на сервере, чтобы их функции были доступны.

Анализ вашего INI не будет узким местом для вашего приложения. Ради простоты, просто разобрать его каждый раз. Эти 0,00001 мс вы сэкономите, иначе это не стоит.


include_once() и require_once() не имеет никакого отношения к стойкости. Он просто указывает PHP включать скрипт , только если он не был включен во время этого запроса .

0 голосов
/ 13 марта 2011

Прежде всего, чтение *.ini вряд ли станет узким местом любого сервиса в нормальных условиях, поэтому действительно подумайте, перевешивают ли преимущества, которые вы ищете (которые ...?), Перевешивающие недостатки. У меня нет проблем при сканировании INI-файлов, хотя я обычно использую нативный PHP для выполнения некоторых настроек, если для этого не требуется программист, не работающий с PHP. Конечно, люди теперь будут защищать хранилища ключей / значений, такие как APC и Memcached, из-за проблемы с постоянством, но это будет преимуществом только в том случае, если ваш файл (относительно) огромен для INI-файла, в противном случае это просто накладные расходы, если вы не не использую его уже.

Единственный способ, которым я знаю, как легко получить (скалярную) настройку для запросов без расширений в Apache, - это заняться SetEnv бизнесом в конфигурации хоста (поэтому скалярные значения просто считываются из среды), но это kludgy в лучшем случае, и требует перезапуска сервера или перезапуска, чтобы принять изменения.

Оставайтесь с ini-файлом или, возможно, с прямым PHP-файлом с настройками, и в этом случае APC может предоставить вам небольшое преимущество, кэшируя файл до его изменения.

0 голосов
/ 13 марта 2011

include / require_once означает, что файл будет загружен только один раз во время обработки одного запроса; однако всякий раз, когда получен новый запрос, он будет прочитан снова при анализе сценария.

Кроме того, для того, что вы хотите сделать здесь, вам придется прочитать конфигурацию и поместить ее значение в сеанс; затем, если конкретный ключ, который вы используете в массиве сеансов, определен, вам не нужно повторно анализировать файл:

if ( !array_key_exists( 'config' , $_SESSION ) ) {
    $_SESSION['config'] = parse_ini_file ( 'whatever.ini' );
}

Однако у этого подхода есть существенный недостаток - если файл конфигурации изменится, пользователи, которые уже находятся на сайте, будут продолжать использовать предыдущую версию файла.

...