php.ini 未被读取

php.ini 未被读取

我将 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 加载路径上的特定部分。

清理构建并重新编译后,一切顺利。

相关内容