2012-06-10 49 views
3

我有一臺運行Apache 2.2.21和PHP 5.3.8的Mac OS X服務器如何讓PHP 5.3.8讀取.user.ini文件?

我想爲每個目錄設置一些php.ini樣式指令。根據PHP manual page,從PHP 5.3.0開始,可以通過在包含目錄的目錄中放置一個名爲「.users.ini」的文件來覆蓋主目錄php.ini運行時配置文件中的指令您想要影響的腳本。

對我來說,這個解決方案比使用包含在.htaccess文件中的php_value和php_flag指令更好,但是我創建的.user.ini文件被PHP忽略。

根據phpinfo()函數,我.user.ini文件應該被重新緩存每隔5分鐘,文件名是否正確設置成「.user.ini」:

user_ini.cache_ttl 300 
user_ini.filename .user.ini 

阿帕奇設爲AllowOverides,並且我已經確認通過.htaccess文件設置PHP指令正確覆蓋了我想控制的ini設置。我曾嘗試最簡單的測試文件只包含線.user.ini文件:

display_errors = On 

這不起作用,並且使用全系統目錄(= OFF)。然而,相當於.htaccess文件按預期工作,覆蓋全系統的指令:

php_flag display_errors on 

一個線索我能找到的是神祕的[PHP]在主php.ini文件的開頭。我在手冊中找不到任何關於這部分標記的提及,所以我想也許有必要用[PHP]來啓動該文件。我試着將其添加到我的.user.ini文件的開頭,重新加載我的頁面,等待另外五分鐘,再次重新加載,以確保我沒有加載緩存版本,不幸的是它沒有任何區別。

我發現的另一個線索是前面提到的PHP manual page中描述如何使用.user.ini文件的同樣神祕的陳述:「這些文件只能由CGI/FastCGI SAPI處理。」不幸的是我不知道如何確認這個條件是否滿足,除了我的phpinfo()輸出中的行,它說:「GATEWAY_INTERFACE CGI/1.1」,因爲在我的phpinfo中實際上沒有其他字符串「cgi」的實例)輸出。我只能假設這個神祕的陳述並不重要,只是說明CGI/FastCGI SAPI會處理(不管這意味着什麼),而不是告誡我需要開啓某些東西。如我錯了請糾正我。

在同一個.user.ini手冊頁的註釋中還提到,在使用php-fpm時,處理.user.ini文件不起作用。據我所知,我沒有使用,但如果有一個簡單的方法來檢查,讓我知道。這確實引發了是否存在其他配置選項或與該功能衝突的模塊並禁用加載.user.ini文件的問題。任何人都知道這個答案?

爲了完整性,我包括我的configure命令,萬一有人可以看到一些明顯的問題,但我不認爲我已經從默認改變了它:

「/私營/ var/tmp中/ apache_mod_php/apache_mod_php-53。8〜2/php/configure''--prefix =/usr''--mandir =/usr/share/man''--infodir =/usr/share/info''--disable-dependency-tracking'' --sysconfdir =/private/etc''--with-apxs2 =/usr/sbin/apxs'--enable-cli''--with-config-file-path =/etc''--with-libxml -dir =/usr''--with-openssl =/usr''--with-kerberos =/usr''--with-zlib =/usr''--enable-bcmath''--with-bz2 =/usr''--enable-calendar''--with-curl =/usr''--enable-exif''--enable-ftp''--with-gd''--with-jpeg-dir = /BinaryCache/apache_mod_php/apache_mod_php-53.8~2/Root/usr/local''--with-png-dir =/BinaryCache/apache_mod_php/apache_mod_php-53.8〜2/Root/usr/local''--enable-gd- native-ttf''--with-ldap =/usr''--with-ldap-sasl =/usr''--enable-mbstring''--enable-mbregex''--with-mysql = mysqlnd'' --with-mysqli = mysqlnd''--with-pdo-mysql = mysqlnd''--with-mysql-sock =/var/mysql/mysql.sock''--without-pear''--with-iodbc =/usr''--enable-shmop''--with-snmp =/usr''--enable-soap''--enable-sockets''--enable-sysvmsg''--enable-sysvsem'' --enable-sysvshm''--enable-wddx' '--with-xmlrpc''--with-iconv-dir =/usr''--with-xsl =/usr''--enable-zend-multibyte''--enable-zip''--with- PCRE正則表達式=的/ usr」

(因爲你,親愛的讀者,已經遠遠看這個,如果你看到一些奇怪的關於上述配置這是不相關的,隨意提到它在連接到該原始評論後)

+1

user.ini文件只能在FCGI模式下工作。看起來你正在以apache SAPI模式運行。所以沒有你的運氣。 – hakre

回答

0

按照手冊還有更遠:

「如果你使用的是Apache,使用.htaccess文件達到相同的效果。」

另外,你是否通過Apache在CGI或FastCGI模式下運行PHP?

+0

是的,但正如我在我的原始文章中提到的,.user.ini文件是遠遠優選的。原因之一是ini文件可以識別PHP預定義的常量,例如E_ALL,而.htaccess文件會強制使用整數。我不知道如何查看我是否在CGI或FastCGI模式下運行PHP。根據fastcgi.com,看起來如果我使用它,在我的配置命令中會出現「--with-fastcgi =/usr/local」命令或類似命令。正如你在上面看到的那樣,沒有。 –

+0

我也注意到你的configure命令中缺少「--with-fastcgi」,但我不確定這是否是CGI模式的必要條件。我一直沒有能夠獲得.user.ini文件在我的服務器上工作,但我確定我沒有像CGI那樣運行。 – TylerH4

14

從其他會員的評論中收集一些線索,我已經做了足夠的研究來正確回答這個問題以備將來參考。

  1. 直接在Apache作爲Apache模塊(mod_php的),也稱爲SAPI(服務器:

    如PHP文檔的General Installation Considerations部分所解釋的,PHP可以一起在以下兩種方式之一Apache服務器運行應用程序編程接口)或

  2. 作爲獨立的可執行文件,通過CGI(通用網關接口)或FastCGI協議與Apache進行通信。

當PHP作爲Apache內的模塊(Mac OS X Server上的默認設置)運行時,PHP無法直接訪問文件系統,並且Apache提供了PHP需要的所有工作。這意味着從文件系統中選擇最後一分鐘,每個目錄的配置選項不是一種選擇。這意味着Apache需要負責將任何每個目錄的設置交給PHP處理器,因此必須通過.htaccess進行設置(Apache處理並傳遞給PHP)

當PHP以自己的進程運行時(與Apache通過CGI或FastCGI),PHP處理器可以在開始處理腳本之前直接訪問目錄結構,因此可以在每個目錄基礎上加載額外的配置文件,這會影響諸如顯示解析錯誤(不可能在腳本的運行時決定,因爲如果腳本不解析,PHP不能遵循其中的任何指令)。

所以簡短的版本是,如果PHP作爲Apache模塊運行,則需要通過.htaccess文件設置每個目錄的配置指令,或切換到通用網關接口。

+0

感謝您的回答。我清楚地知道兩者之間的區別了! – TylerH4