PHP.ini 无法加载

PHP.ini 无法加载

好吧,这可能只是我对 php 了解不够,但还是说到这里。

我在 Ubuntu Hardy 上。我有一个自定义编译版本的 PHP,我用这些参数进行了编译。

./configure
--enable-soap
--with-zlib
--with-mysql
--with-apxs2=[correct path]
--with-config-file-path=[correct path]
--with-mysqli
--with-curlwrappers
--with-curl
--with-mcrypt

我已使用该命令pecl install pecl_http安装 http.so 扩展。它位于我的 php.ini 的正确模块目录中。我的 php.ini 正在加载,我可以更改 ini 中的内容并影响 php。我已将该extension=http.so行包含在我的 php.ini 中。

一切正常。直到我添加了这些编译选项以添加 imap

--with-openssl
--with-kerberos
--with-imap
--with-imap-ssl

但是失败了,因为我需要 c-client 库,我通过apt-get install libc-client-dev之后的 php 编译成功并且我可以使用 imap 支持了,woo。

但是,现在我对 HttpRequest(http.so 中 pecl_http 扩展的一部分)的所有调用都会导致Fatal error: Class 'HttpRequest' not found错误。我认为 http.so 模块由于某种原因不再加载,但我找不到任何显示原因的错误。

您可能会说“您尝试过撤消新的 imap 设置吗?”我会回答。是的,我试过。我直接撤消了所有配置更改并卸载了 c-client 库,但仍然无法使其工作。我觉得这很奇怪……我没有进行会导致此问题的更改。查看后,我还发现不仅 http 扩展不再加载,而且通过 php.ini 加载的所有扩展都不再加载。

有人能至少给我一些进一步的调试步骤吗?到目前为止,我已尝试启用 php.ini 中的所有错误(包括启动错误),这适用于其他错误,但我在命令行或通过 apache 均未看到任何启动错误。而且,php.ini 似乎再次被解析,因为如果我运行 php_info(),我会得到 php.ini 中的设置。

编辑似乎只有部分 php.ini 设置被监听。有没有什么方法可以测试我的 php.ini?

編輯 ...看来我又搞错了,php.ini 根本就没被加载。但是,如果我运行 php_info(),我会发现它在正确的位置查找我的 php.ini。

編輯 ...我的配置位于下面的配置文件路径位置,但它显示未加载配置文件。WTF 权限问题?它目前是 644,所以每个人都应该能够读取它,即使不能写入它。我尝试将其设置为 777,但没有成功。

Configuration File (php.ini) Path   /etc/php.ini
Loaded Configuration File   (none)

編輯 ...通过在命令行上使用 -c 命令加载 ini,我可以运行我的文件,并且使用 -m 显示我的模块已加载,因此 php.ini 没有任何问题

编辑 编辑 编辑 编辑 编辑有人向我指出,我的 ini 目录配置应该是查找 php.ini 文件的路径,而不是文件本身。为此,我尝试设置 /etc、/etc/,并让 php 设置默认目录,然后将我的 ini 文件移动到该目录中。全部失败 :(

编辑 编辑 编辑 编辑 编辑 编辑更多信息,命令行运行 php --ini 并 ls 它在 php 设置中指向的目录。在命令行上使用 -c 选项运行,运行成功,而当我不包含 -c 时则不成功

j@j:/usr/local/lib$ php -ini | grep Configuration
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => (none)
Configuration
j@j:/usr/local/lib$ ls /usr/local/lib
php  php.ini  python2.5  site_ruby
j@j:/usr/local/lib$ php -c /usr/local/lib/php.ini /var/www/toolbelt/test.php
j@j:/usr/local/lib$ php /var/www/toolbelt/test.php

Fatal error: Class 'HttpRequest' not found in /var/www/toolbelt/test.php on line 7
jonathan@jonathan:/usr/local/lib$

编辑 编辑 编辑 编辑 编辑 编辑 编辑更多信息。利用下面显示的 strace 方法,我测试了在加载 php 时是否有任何尝试打开 ini 文件的尝试。没有

j@j:/usr/local/lib$ sudo strace  -e trace=open php -ini 2>&1 |grep  php.ini
Configuration File (php.ini) Path => /usr/local/lib
j@j:/usr/local/lib$ sudo strace  -e trace=open php -ini 2>&1 |grep  /usr/local/lib
Configuration File (php.ini) Path => /usr/local/lib
extension_dir => /usr/local/lib/php/extensions/no-debug-non-zts-20060613 => /usr/local/lib/php/extensions/no-debug-non-zts-20060613
include_path => .:/usr/local/lib/php => .:/usr/local/lib/php

答案1

检查“--with-config-file-path=”选项的值。它应该是 /etc 而不是 /etc/php.ini。似乎 Apache 正在尝试加载 /etc/php.ini/php.ini,这就是找不到该文件的原因。

如果这不起作用,你可以使用 strace 检查 php 打开了哪些文件:

strace -f -e trace=open php --ini

答案将帮助您找出 php 在哪里寻找 php.ini 文件。这是我的一台服务器中的输出:

10833 open("/usr/bin/php-cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
10833 open("/etc/php-cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
10833 open("/usr/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
10833 open("/etc/php.ini", O_RDONLY)    = 3

答案2

好的,希望这可以防止其他人连续几个小时撞墙。

我在清理 php 构建时找到了自己的解决方案。事实证明,您可以更改选项with-config-file-path并让其更改 phpinfo() 和 php -ini 输出中显示的路径。但是,如果您不清理构建,则实际使用该设置的位置将不会重建,并且会破坏您的构建。

提醒自己:一定要清理你的构建。我以前就知道这一点,但重建确实改变了 php 告诉我的目录,这让我很困惑。

相关内容