PHP.INI設定檔漫遊(2)
最後更新:2017-02-28
來源:互聯網
上載者:User
文章第一部分已經帶領你領略了php.ini檔案的結構,並且說明了如何修改PHP尋找路徑、差錯處理,以及解析器的相關選項。第二部分將深入設定檔,內容包括如何啟用PHP擴充選項、針對PHP指令碼設定資源限制,以及通過PHP指令碼動態改變更配置置變數。
啟用擴充選項
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配置做動態修改,這將會給你帶來很大的方便。