一般來說你不需要改變PHP設定,它根據預設的配置通常就能很好的工作。但作為PHP設計者的開發人員們考慮到使用者可能偶爾需要針對特定應用程式對PHP語言的一些功能進行調整。因此,他們將一些PHP變數通過名為php.ini的設定檔顯示出來。此設定檔允許使用者調整PHP多項功能,包括設定檔案路徑以及目錄、改變會話以及資料庫參數,以及啟用擴充選項(activating extensions)等。
在開始我們的介紹之前,我們將對PHP設定檔的組織方式進行簡要的說明。檔案命名為php.ini的原因之一就是它遵循許多Windows應用程式中INI檔案的常見結構。它是一個ASCII文字檔,並且被分成幾個不同名稱的部分,每一部分包括與之相關的各種變數。每一部分類似於如下結構:
[MySection]
variable="value"
anothervariable="anothervalue"
各部分的名稱通過方括弧括起來放在頂部,然後將是一對對任意數量的“變數名——值”,每一對占單獨一行。同常規的PHP代碼要求一樣,變數名區分大小寫且不能包含空格,變數的值可以是數字、字串,或者布朗型(Boolean)。
每一行如果以分號開頭則表明該行是備註陳述式。這也使得允許或禁止PHP功能變得非常簡單。你只需要將相關語句注釋而無需刪除,該語句就不會被系統解析。特別是當你希望在一段時間以後重新開啟某種功能的時候特別方便,因為你不需要在設定檔中將此行刪除。
為了便於PHP識別,php.ini檔案必須要麼放在目前的目錄,要麼放在$PHPRC環境變數所定義的目錄中,或者是在編譯時間所指定的目錄(對Windows PHP來說即Windows主目錄)。
在通過修改php.ini檔案改變PHP配置之後,需要重啟Web伺服器以使配置改變生效(當然這是在通過Web伺服器使用PHP的情況下)。對於PHP命令列使用模式,每次只要涉及到PHP二進位程式的時候系統都會讀取設定檔。
這是設定檔漫遊的第一站也是非常重要的一站:語言解釋程式相關選項。第一行是引擎變數,它將控制PHP引擎是“on”還是“off”。關閉引擎則意味著嵌入的PHP代碼將不會被Web伺服器所解析。通常將其關閉是毫無意義的,所以保持開啟狀態。
engine = On
short_open_tag則控制解析器是否識別簡寫的<?...?>標誌,即將其等價為標準<?php...?>標誌。如果預計簡寫標誌會和別的語言產生衝突,或者希望對PHP代碼採用嚴格的文法規則,那麼可以將其關閉。
short_open_tag = On
通常而言,在PHP指令碼中的會話、cookie或者HTTP檔案頭資料必須在指令碼產生任何輸出之前發送出去。如果在你的應用程式中不可能實現,你可以通過允許PHP稱之為output buffering功能來達到這一目的,此功能通過output_buffering變數進行控制。
如果開啟output buffering,PHP將把指令碼產生的運行結果存放在特殊的記憶體緩衝區域內,並在得到明確指示時才將其發送出去。通過這樣的方式,你甚至可以在指令碼中部或者指令碼尾部發送特殊的HTTP檔案頭以及cookie資料。當然,這樣會造成指令碼運行效能一定程度的下降。
output_buffering = Off
你還可以為output_buffering變數賦值以指定緩衝區域大小,例如:
output_buffering = 2048
當PHP啟動的時候,它將在Web伺服器標準頭資訊中添加PHP版本號碼資訊。如果希望關閉此功能,可以將expose_php設定為false。這項功能非常有用,例如,可以在Web伺服器上屏蔽此資訊以防範潛在的駭客攻擊。
expose_php = On
現在來看看如何設定尋找路徑以及差錯控制。
可以通過include_path變數設定PHP尋找路徑。它允許包括一系列目錄。在相關檔案調用缺少指定路徑的情況下,PHP將自動檢查這些目錄。
如果有頻繁使用的函數庫或類,也可以將其位置寫在這裡以方便尋找。這也是一個很好的添加PHP的PEAR目錄路徑的地方,此路徑將包括很多可重用的類。
include_path = ".:/usr/local/lib/php/pear:"
Windows使用者可以通過分號分割路徑名來指定多重路徑;UNIX使用者則需要使用冒號。
另外兩個有趣的變數是auto_prepend_file以及auto_append_file。這些變數指定PHP自動添加到任何PHP文檔檔案頭或檔案尾的其他檔案。這對於為PHP產生的頁面添加頁首或頁尾非常有用,可以節省為每個PHP文檔添加代碼的時間。但需要注意這裡的指定檔案將會添加到所有的PHP文檔中,所以這些變數必須適合單應用程式(single-application)的伺服器。
所包含的檔案要麼是PHP指令碼,要麼是普通的HTML文檔。嵌入式PHP代碼必須用標準<?php...?>標記括起來。
auto_prepend_file = /home/web/includes/header.php
auto_append_file = /home/web/includes/legal.php
PHP的差錯可以分為四類:解析錯誤、關於代碼小問題的提示(notice)(例如變數未初始化)、警告(除了非致命錯誤),以及致命錯誤(fatal errors)。通常而言,當PHP遇到除第二種(關於代碼小問題的提示)以外的錯誤時,將顯示錯誤資訊,並且如果屬於致命錯誤則會立即停止代碼處理。你可以通過修改error_reporting變數來對此功能進行修改。此變數可以接收一位元位的錯誤碼,且只顯示同這些代碼相同的錯誤。
error_reporting = E_ALL
要關閉顯示所有錯誤——在產品代碼中通常建議這麼做——可以將display_errors變數設定為false,並使用log_errors變數將資訊寫入錯誤記錄檔(error log)。
此舉可以提高系統的安全效能——通過關閉錯誤顯示,你可以將系統的特定資訊隱藏起來,惡意使用者就無法利用這些資訊試圖入侵網站或應用程式。但你應當通過將error_log變數指定為檔案名稱或特殊值“syslog”,從而將這些錯誤資訊寫入到自訂記錄檔或者系統日誌中。請記住定期檢查這些檔案,以知道在應用程式內部到底發生了什麼。
display_errors = Off
log_errors = On
error_log = "error.log"
PHP可以使用很多不同的擴充選項。在UNIX系統中,擴充選項需要在編譯時間建立;而對於Windows,二進位DLL檔案將隨PHP發布而將自己包括進去。變數extension_dir包括了PHP應當查看相關擴充選項的目錄名。
extension_dir = "C:\Program Files\Internet Tools\Apache\bin\php4\extensions"
Windows下的PHP包括了20種不同的擴充選項,並且全部都列在了php.ini檔案中(通過注釋)。要啟用某個特定的擴充選項只需要將相應行首的分號去掉並重啟伺服器就可以了。如果要禁用某個擴充選項(比如在需要提升系統效能的情況下),只需要在行首重新添加分號。
如果擴充選項沒有列在php.ini檔案中,可以使用變數extension,然後將相應DLL檔案名稱傳遞給此變數。
extension=php_domxml.dll
extension=php_dbase.dll
設定extension-specific變數
變數extension-specific被存放在設定檔中一個單獨的地區。比如,所有同MySQL擴充功能相關的變數都應當儲存在php.ini中的[MySQL]地區。
如果需要使用PHP的mail()函數,則需要設定以下三個變數。當通過PHP mail()函數寄送電子郵件資訊時需要使用SMTP以及變數sendmail_from(Windows系統)或變數sendmail_path(UNIX系統)。對於Windows,這些變數設定了所用到的SMTP伺服器以及顯示在電子郵件資訊中的“From:”地址;而對於UNIX,變數sendmail_path則對郵件傳輸設定了MTA(郵件傳輸代理程式,mail transfer agent)的路徑。
SMTP = myserver.localnet.com
sendmail_from = me@localhost.com
sendmail_path = /usr/sbin/sendmail
變數java.class.path、java.home、java.library以及java.library.path全部用來設定尋找Java類以及庫的路徑。這些值將被Java擴充所使用,所以如果希望PHP能正確的同Java程式進行整合,則必須確保這些變數被正確的設定。
java.class.path = .\php_java.jar
java.home = c:\jdk
java.library = c:\jdk\jre\bin\hotspot\jvm.dll
java.library.path= .\
變數session.save_path指定了儲存會話資訊所需的臨時目錄。通常而言,此目錄預設為/tmp,但由於在Windows系統中此預設目錄並不存在,所以你必須將其重新設定為正確的Windows臨時目錄,否則會話處理常式將會在調用session_start()函數時彈出討厭的出錯資訊。同時可以通過變數session.cookie_lifetime來控制會話cookie的有效期間。
session.save_path = c:\windows\temp
session.cookie_lifetime = 1800
在php.ini中,有很多同PHP安裝的安全問題相關的變數。其中最有趣的是safe_mode變數,建議針對ISP以及共用主機服務(shared-hosting services)對其進行設定,此變數將對使用者對PHP的使用範圍進行限制。
safe_mode = Off
當safe mode開啟的時候,可以通過變數safe_mode_include_dir指定在何目錄中尋找相關檔案。通過將二進位程式放在特定目錄並使用safe_mode_include_dir變數將目錄告之PHP,PHP將對可使用exec()命令運行PHP指令碼的程式種類進行限制。在此目錄中僅二進位檔案可以通過exec()命令進行訪問。
safe_mode_include_dir = /usr/local/lib/php/safe-include
safe_mode_exec_dir = /usr/local/lib/php/safe-bin
還可以通過變數open_basedir來限制檔案操作。此變數將設定作為檔案操作根(root)的目錄名。此變數設定後,對於PHP來說,存放在此分類樹以外的檔案將無法訪問。這對於在共用系統中將使用者限制在各自的home或者Web目錄是一種很好的方法。
open_basedir = /home/web/
變數max_execution_time設定了在強制終止指令碼前PHP等待指令碼執行完畢的時間,此時間以秒計算。當指令碼進入了一個無限迴圈狀態時此變數非常有用。然而,當存在一個需要很長時間完成的合法活動時(例如上傳大型檔案),這項功能也會導致操作失敗。在這樣的情況下必須考慮將此變數值增加,以避免PHP在指令碼正在執行某些重要過程的時候將指令碼關閉。
max_execution_time = 90
剛提到了上傳,現在來看看如何配置uploads變數以及form變數。
如果我們在文章前面所討論安全配置所提供的安全強度還不能滿足你的要求,可以通過關閉檔案上傳或設定每次上傳最大檔案尺寸限制來進一步提高安全強度。以上兩種功能將分別通過變數file_uploads和upload_max_filesize來實現。通常來說,除非系統中有為接收檔案而設計的應用程式(例如基於Web FTP服務的圖片冊),你應當設定一個相對較小的檔案尺寸限制值。
file_uploads = On
upload_max_filesize = 2M
如果你對於上傳檔案並不關心,但在PHP應用程式中使用了大量的表單,這裡有兩個變數將會讓你產生很大的興趣。首先是變數register_globals,它解決了PHP開發人員長期以來的心頭之痛。在PHP 3.x中,此變數預設為On。由此當提交表單時表單變數將自動的轉換成PHP變數。
在PHP 4.x中,出於安全考慮,此變數預設設定為Off。由此,表單變數將只能通過特定的$_GET以及$_POST進行訪問。這也造成了很多用PHP 3.x編寫的指令碼在運行時出現問題,要求開發人員重寫指令碼並對其重新測試。比如,輸入到表單域<input type="text" name="email">中的值對於PHP 3.x指令碼來說將可以理解為$email;而在PHP 4.x指令碼中卻被作為$_POST['email']或者$_GET['email']。
通常情況下可以將此變數設定為Off,這樣可以對通過表單進行的指令碼攻擊提供更為安全的防範措施。如果需要考慮到對早期PHP 3.x指令碼的相容問題,則應當置於On。
register_globals = Off
同表單提交相關的一個變數是post_max_size,它將控制在採用POST方法進行一次表單提交中PHP所能夠接收的最大資料量。似乎不大可能需要將預設的8 MB改得更大。相反,應當適當將其降到更為實際的數值。但如果希望使用PHP檔案上傳功能,則需要將此值改為比upload_max_filesize還要大。
post_max_size = 8M
在PHP 5中增加了max_input_time變數。此變數可以以秒為單位對通過POST、GET以及PUT方式接收資料時間進行限制。如果應用程式所運行環境處在低速鏈路上,則需要增加此值以適應接收資料所需的更多時間。
max_input_time = 90
你還可以通過調整一些變數值來提升PHP解析器的效能。為了避免正在啟動並執行指令碼大量使用系統可用記憶體,PHP允許定義記憶體使用量限額。通過memory_limit變數來指定單個指令碼程式可以使用的最大記憶體容量:
memory_limit = 8M
變數memory_limit的值應當適當大於post_max_size的值。
另一項可以用於提高效能的方法是禁用變數$argc以及$argv,這兩個值被用於存放在命令列中傳遞給應用程式的參數數量以及實際參數值。
register_argc_argv = false
類似,還可以禁用$HTTP_GET_VARS以及$HTTP_POST_VARS,因為在使用$_GET以及$_POST的今天你不大可能用到前兩種方式。禁用此功能可以帶來效能上的提升,但這隻能通過PHP 5中的變數register_long_arrays實現。
register_long_arrays = false
函數ini_set()
最後,需要注意ini_set()函數。當PHP讀取php.ini設定檔中的所有設定資訊的同時,它還提供了採用ini_set()函數根據per-script原則更改這些設定的功能。此函數接收兩個參數:需要調整的組態變數名,以及變數的新值。例如,在某指令碼出現時增加最大執行時間(maximum execution time):
<?php
ini_set('max_execution_time', 600)
// more code
?>
這樣的設定將僅僅影響被設定的指令碼。一旦指令碼執行完畢,該變數將自動回復到原始值。
如果PHP應用程式運行在一個共用伺服器上,你不大可能可以訪問到主php.ini設定檔。這時,函數ini_set()就可以允許根據特殊要求對PHP配置做動態修改,這將會給你帶來很大的方便。