Apache-2.2

PHP.ini 不載入

  • February 10, 2011

好的,這可能只是我對 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 支持,哇。

但是,現在我對 HttpRequest 的所有呼叫(它是 http.so 中 pecl_http 擴展的一部分)都會導致Fatal error: Class 'HttpRequest' not found錯誤。我認為 http.so 模組由於某種原因不再載入,但我找不到任何顯示原因的錯誤。

您可能會說“您是否嘗試過撤消新的 imap 設置?” 我會回答的。是的,我有。我直接撤消了所有配置更改並解除安裝了 c-client 庫,但仍然無法正常工作。我覺得這很奇怪……我沒有做任何會導致這個問題的更改。在查看之後,我還發現不僅不再載入 http 擴展,而且我通過 php.ini 載入的所有擴展也不再載入。

有人至少可以給我一些進一步的調試步驟嗎?到目前為止,我已經嘗試啟用所有錯誤,包括我的 php.ini 中的啟動錯誤,這適用於其他錯誤,但我在命令行或通過 apache 都沒有看到任何啟動​​錯誤。鑑於如果我執行 php_info() 我會得到 php.ini 中的設置,因此似乎再次解析了 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 的命令行執行和它在 php 設置中指向的目錄的 ls。還可以在執行成功的命令行上使用 -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 時所做的 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

好的,希望這可以防止其他人將頭撞到牆上幾個小時。

我在乾淨建構我的 php.ini 時找到了自己的解決方案。事實證明,您可以更改with-config-file-path選項並讓它更改 phpinfo() 和 php -ini 輸出中顯示的路徑。但是,如果您不清理建構,則實際使用該設置的地方不會被重建,並且會破壞您的建構。

自我注意:總是清理你的建構。我以前知道這一點,但被重建實際上改變了 php 告訴我目錄的事實而被拋棄了。

檢查“–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

引用自:https://serverfault.com/questions/233607