Я настроил PHP для поиска файла php.ini в / etc / php5 / apache2. вывод phpinfo () говорит, что путь был установлен правильно, но также говорит, что файл конфигурации не был загружен. Я временно изменил разрешения php.ini на 777, чтобы проверить эту проблему, и разрешения не являются проблемой. в чем еще может быть проблема?
Когда я скомпилировал php, я сделал:
sudo ./configure --with-apxs2=/usr/sbin/apxs --with-mysql --enable-so --with-config-file-path=/etc/php5/apache2 --sysconfdir=/etc/php5 --with-config-file-scan-dir=/etc/php5/conf.d
phpinfo () говорит:
Configuration File (php.ini) Path /etc/php5/apache2
Loaded Configuration File (none)
Scan this dir for additional .ini files (none)
Additional .ini files parsed (none)
Также php --ini говорит: Файл конфигурации (php.ini) Путь: / usr / local / lib Загруженный файл конфигурации: /etc/php5/apache2/php.ini Сканирование дополнительных файлов .ini в: (нет) Дополнительный .ini файлы проанализированы: (нет)
И если я помещу php.ini в / usr / local / lib, файл конфигурации загрузится нормально (хотя дополнительные файлы .ini не загружаются). Я не уверен, почему это происходит, поскольку я устанавливал параметры при компиляции PHP.
Ядерный вариант - запустить apache под strace, чтобы посмотреть, что он делает, когда пытается прочитать файл php.ini.
Запустите «ps aux», чтобы найти командную строку для apache, затем остановите процесс. Теперь запустите:
# strace -efile -f -o /tmp/apache.log /usr/sbin/apache2 -k start
Запросите свою страницу phpinfo () в браузере, а затем убейте strace с помощью ctrl-c. Теперь вы можете найти php.ini с помощью команды grep /tmp/apache.log и посмотреть, отображаются ли какие-либо ошибки при попытке чтения этого файла. Это покажет вам проблемы, такие как не найденный файл или проблемы с разрешениями.
Если есть вызов open (), который возвращает число, тогда может показаться, что он правильно читает файл, и должна быть проблема с файлом, который мешает php правильно его проанализировать, но я ожидал, что это будет вошел в журнал ошибок.
В качестве обходного пути вы можете использовать директиву PHPIniDir в конфигурации Apache, чтобы заставить PHP использовать определенный файл php.ini.
<IfModule mod_php5.c>
PHPIniDir "usr/local/lib"
</IfModule>
Теперь это должно заставить PHP использовать ваш файл php.ini.
Вы перезапускали apache после изменения php.ini?
Если да, то в некоторых операционных системах кажется, что apache будет кэшировать данные, поэтому вместо выполнения /etc/init.d/apache reload
вам нужно будет сделать либо /etc/init.d/apache restart
или /etc/init.d/apache force-reload
Каталоги / etc имеют / etc / php5 должны выполнять разрешения для других. То есть,
chmod o+x /etc /etc/php5
Если в каталоге / etc / php5 / apache2 есть пользователь или владелец группы в качестве apache. Тогда по крайней мере одна из группы или пользователя должна иметь разрешение на чтение и выполнение в / etc / php5 / apache2. Или просто дайте другим разрешение на чтение и выполнение в каталоге / etc / php5 / apache2. То есть,
chmod o+rx /etc/php5/apache2
Последнее, не делайте php.ini 777. Это может вызвать проблемы, если apache проверяет права безопасности на файл, чтобы убедиться, что он не доступен для записи всем. Используйте 755 на php.ini. Этого более чем достаточно, чтобы убедиться, что проблема не в управлении доступом.
Точно так же apache должен иметь возможность читать и другие ini-файлы. Другие ini-файлы должны иметь разрешение на чтение для других или они должны принадлежать пользователю / группе apache, и для пользователя / группы установлены разрешения на чтение.
Через некоторое время с той же проблемой я понял, что даже если я перекомпилировал PHP с правильными путями для загрузки конфигурации, я забыл сделать make clean
перед перекомпиляцией. По-видимому, он не восстанавливает конкретную часть пути загрузки php.ini, если вы не очистите объектные файлы.
После чистки сборки и перекомпиляции все прошло нормально.