Каждый PHP-FPM Worker индивидуально загружает php.ini?

Я установил PHP 5.3.8 из источника на Ubuntu Natty. Я также включил FPM во время настройки.

Однако у меня возникли проблемы с установкой расширений PHP. Когда я добавляю расширение в файл php.ini (например, extension=apc.so ) и перезагружаю PHP (например, /etc/init.d/php-fpm restart ), я получаю сообщение об ошибке, подобное приведенному ниже:

 Starting php-fpm PHP Warning: Module 'apc' already loaded in Unknown on line 0 <br /> <b>Warning</b>: Module 'apc' already loaded in <b>Unknown</b> on line <b>0</b><br /> PHP Warning: Module 'geoip' already loaded in Unknown on line 0 <br /> <b>Warning</b>: Module 'geoip' already loaded in <b>Unknown</b> on line <b>0</b><br /> PHP Warning: Module 'imagick' already loaded in Unknown on line 0 <br /> <b>Warning</b>: Module 'imagick' already loaded in <b>Unknown</b> on line <b>0</b><br /> PHP Warning: Module 'memcache' already loaded in Unknown on line 0 <br /> 

У моего PHP-FPM conf есть настройка pm.start_servers = 5 , поэтому у меня около 5 рабочих PHP-FPM. Все они пытаются загрузить файл php.ini при перезапуске PHP (отсюда сообщение о том, что модуль уже загружен) ?! Если это так, есть ли способ предотвратить это, чтобы остановить ошибки, поскольку ошибки становятся фатальными при загрузке Zend Loader?

Заранее спасибо.

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

В основном, это связано с использованием php-fpm.conf для загрузки всех ваших PHP-расширений вместо php.ini. Вот что вы делаете:

  1. Откройте файл php-fpm.conf (я установил свой php из источника, поэтому у меня есть мой /usr/local/php/etc/php-fpm.conf на основе того, как я настраиваю my --prefix и --with-config-file-path , но вы можете использовать find / -name "php-fpm.conf" из оболочки bash, чтобы найти, где находится ваш).

  2. Добавьте свои директивы загрузки расширения (в идеале в конце файла). Вы должны быть осторожны, так как формат немного отличается. В вашем файле php.ini это будет похоже на это extension=apc.so , но в вашем файле php-fpm.conf он должен быть определен как этот php_admin_value[extension]=apc.so

ПРИМЕЧАНИЕ. Убедитесь, что ваш файл extension_dir (где вы сохранили все .so-файлы для ваших расширений) определен в вашем файле php.ini. Затем перезапустите php-fpm.

Я сделал это и больше не имею ошибок, и все мои расширения отображаются в phpinfo() .

Надеюсь, это помогает кому-то, это практически сводило меня с ума.

Приветствия.

РЕДАКТИРОВАТЬ

После дальнейшего тестирования я обнаружил, что проблема была на самом деле немного сложнее. Это вызвано тем, что PHP загружает php.ini дважды, поскольку я указал то же место для --with-config-file-path и --with-config-file-scan-dir во время компиляции.

Таким образом, вы хотели бы сделать следующее как лучшую альтернативу тому, что я указал выше (что также работает, но имеет ограничение, поскольку вы не сможете загружать расширения Zend, например IonCube Loader):

  1. Скомпилируйте PHP со следующей опцией --with-config-file-scan-dir=/usr/local/php/etc/conf.d Сделайте это другой каталог из --with-config-file-path .
  2. Создайте отдельный файл для загрузки расширений PHP (вы можете назвать его phpext.ini) и сохраните его в указанном выше месте, т.е. /usr/local/php/etc/conf.d . В этом файле укажите все расширения, которые вы хотите загрузить, например extension=apc.so Ваши расширения должны быть сохранены в каталоге /usr/lib/php5/20090626/ , который, как я полагаю, должен быть каталогом по умолчанию. Убедитесь, что вы не определяете свои расширения в основном файле php.ini.
  3. Перезапустить PHP

Теперь все будет работать нормально, и вы сможете загружать Zend Extensions (так как они должны быть определены в вашем файле php.ini и не могут быть в php-fpm.conf).

Приветствия.

Ubuntu использует несколько файлов confiugration для PHP, часто один для расширения. Если вы устанавливаете расширение с помощью системного программного обеспечения (например, apt), вам не нужно вручную включать расширение в файл php.ini .

Если вы удалите файлы, добавленные в php.ini это должно решить вашу проблему.

Дополнительно: PHP читает все ini-файлы один раз за активный процесс.

Убедитесь, что в файле /etc/php5/conf.d отсутствуют какие-либо файлы geoip / apc sub-ini. Ubuntu имеет тенденцию загружать внешние драйверы, вставляя их .ini в каталог conf.d и оставляя основной .ini один.