我将 PHP 配置为在 /etc/php5/apache2 中查找 php.ini 文件。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 时设置了选项。
答案1
核心选项是在 strace 下运行 apache,以查看它在尝试读取 php.ini 文件时执行的操作。
运行“ps aux”查找 apache 的命令行,然后停止该进程。现在运行:
# strace -efile -f -o /tmp/apache.log /usr/sbin/apache2 -k start
在浏览器中请求 phpinfo() 页面,然后使用 ctrl-c 终止 strace。现在您可以 grep /tmp/apache.log 查找 php.ini,并查看在尝试读取该文件时是否显示任何错误。这将向您显示诸如文件未找到或权限问题之类的问题。
如果有一个 open() 调用返回一个数字,那么看起来它正在正确读取文件,并且文件一定存在问题导致 php 无法正确解析它,但我希望这会记录在错误日志中。
答案2
作为一种解决方法,你可以在 Apache 配置中使用 PHPIniDir 指令来强制 PHP 使用特定的 php.ini 文件
<IfModule mod_php5.c>
PHPIniDir "usr/local/lib"
</IfModule>
现在应该强制 PHP 使用您的 php.ini 文件。
答案3
更改 php.ini 后您是否重新启动了 apache?
如果你这样做了,在某些操作系统上,Apache 似乎会缓存数据,因此/etc/init.d/apache reload
你需要执行以下任一操作/etc/init.d/apache restart
:/etc/init.d/apache force-reload
答案4
遇到同样的问题一段时间后,我意识到,尽管我使用正确的路径重新编译了 PHP 以加载配置,但我忘记在make clean
重新编译之前执行操作。显然,除非您清除目标文件,否则它不会重新生成 php.ini 加载路径上的特定部分。
清理构建并重新编译后,一切顺利。