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 支持,哇。但是,現在我對 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