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


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

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

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

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

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

Author: hakre, 2011-03-13

3 answers

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

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

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


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

 8
Author: Andrew Moore, 2011-03-13 19:05:35

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

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

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

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

 0
Author: E.Benoît, 2011-03-13 18:54:29

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

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

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

 0
Author: Wrikken, 2011-03-13 19:03:57