https://haydenjames.io/understanding-php-memory_limit/ 很好地說明了 memory_limit 設定。
此列表包含您可以設定以組態您的 PHP 設定的核心 php.ini 指令。擴充功能處理的指令會分別列在擴充功能文件頁面中並詳細說明;例如,關於工作階段指令的資訊可以在工作階段頁面找到。
注意:
此處列出的預設值是在未載入 php.ini 時使用;用於生產和開發的 php.ini 值可能會有所不同。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
short_open_tag | "1" | INI_PERDIR |
|
precision | "14" | INI_ALL |
|
serialize_precision | "-1" | INI_ALL |
在 PHP 7.1.0 之前,預設值為 17。 |
disable_functions | "" | INI_SYSTEM only |
|
disable_classes | "" | php.ini only | |
exit_on_timeout | "" | INI_ALL |
|
expose_php | "1" | php.ini only | |
hard_timeout | "2" | INI_SYSTEM |
PHP 7.1.0 起可用。 |
zend.exception_ignore_args | "0" | INI_ALL |
PHP 7.4.0 起可用 |
zend.multibyte | "0" | INI_ALL |
|
zend.script_encoding | NULL | INI_ALL |
|
zend.detect_unicode | NULL | INI_ALL |
|
zend.signal_check | "0" | INI_SYSTEM |
|
zend.assertions | "1" | INI_ALL with restrictions |
|
zend.exception_string_param_max_len | "15" | INI_ALL |
PHP 8.0.0 起可用。 |
以下是對組態指令的簡短說明。
short_open_tag
bool告訴 PHP 是否應該允許 PHP 開啟標籤的簡短形式 (<? ?>
)。如果您想要將 PHP 與 XML 結合使用,您可以停用此選項以使用內嵌的 <?xml ?>
。否則,您可以使用 PHP 將其列印出來,例如:<?php echo '<?xml version="1.0"?>'; ?>
。此外,如果停用,您必須使用 PHP 開啟標籤的長形式 (<?php ?>
)。
注意:
此指令不會影響簡寫
<?=
,其始終可用。
precision
int-1
表示將使用增強的演算法來四捨五入這些數字。
serialize_precision
int-1
表示將使用增強的演算法來四捨五入這些數字。
expose_php
bool向外界公開伺服器上已安裝 PHP,其中包括 HTTP 標頭中的 PHP 版本(例如,X-Powered-By:PHP/5.3.7)。
disable_functions
stringdisable_classes
string此指令允許停用某些類別。它接受逗號分隔的類別名稱清單。停用類別只會阻止實例化該類別。
只有內部類別可以使用此指令停用。使用者定義的類別不受影響。
此指令必須在 php.ini 中設定。它不能在 httpd.conf 中設定。zend.assertions
int1
時,將會產生並執行斷言程式碼(開發模式)。當設定為 0
時,將會產生斷言程式碼,但在執行階段將會跳過(不執行)。當設定為 -1
時,將不會產生斷言程式碼,使斷言零成本(生產模式)。
注意:
如果程序以生產模式啟動,由於未產生斷言程式碼,因此無法在執行階段變更 zend.assertions。
如果程序以開發模式啟動,則無法在執行階段將 zend.assertions 設定為
-1
。
zend.exception_string_param_max_len
int"0"
和 "1000000"
之間。
hard_timeout
int當達到 max_execution_time 中設定的逾時時,PHP 執行階段將會正常關閉資源。如果在此過程中發生任何卡頓,硬性逾時將會持續計算設定的秒數。當達到硬性逾時時,PHP 將會非正常結束。當設定為 0 時,硬性逾時永遠不會啟用。
當 PHP 因硬性逾時而停止時,它看起來會像這樣
Fatal error: Maximum execution time of 30+2 seconds exceeded (terminated) in Unknown on line 0
zend.exception_ignore_args
bool從例外產生的堆疊追蹤中排除參數。
zend.multibyte
bool啟用以多位元組編碼解析原始程式檔。若要使用像 SJIS、BIG5 等包含多位元組字串資料中特殊字元的字元編碼,則必須啟用 zend.multibyte。與 ISO-8859-1 相容的編碼,如 UTF-8、EUC 等,不需要此選項。
啟用 zend.multibyte 需要 mbstring 擴充功能可用。
zend.script_encoding
string除非在指令碼頂部出現 declare(encoding=...) 指令,否則將會使用此值。當使用與 ISO-8859-1 不相容的編碼時,必須使用 zend.multibyte 和 zend.script_encoding。
文字字串將從 zend.script_encoding 轉換為 mbstring.internal_encoding,如同已調用 mb_convert_encoding() 一樣。
zend.detect_unicode
bool檢查 BOM(位元組順序標記)並查看檔案是否包含有效的多位元組字元。此偵測會在處理 __halt_compiler() 之前執行。僅在 Zend 多位元組模式下可用。
zend.signal_check
bool檢查關閉時是否已更換訊號處理常式。
exit_on_timeout
bool這是僅限 Apache1 mod_php 的指令,如果發生 PHP 執行逾時,會強制 Apache 子程序結束。此類逾時會導致 Apache1 中的內部 longjmp() 呼叫,這可能會使某些擴充功能處於不一致的狀態。透過終止程序,任何未完成的鎖定或記憶體都將會清除。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
memory_limit | "128M" | INI_ALL |
以下是對組態指令的簡短說明。
memory_limit
int這會設定指令碼允許配置的最大記憶體量(以位元組為單位)。這有助於防止寫得不好的指令碼耗用伺服器上所有可用的記憶體。請注意,若要沒有記憶體限制,請將此指令設定為 -1
。
另請參閱:max_execution_time。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
realpath_cache_size | "4M" | INI_SYSTEM |
在 PHP 7.0.16 和 7.1.2 之前,預設值為 "16K" |
realpath_cache_ttl | "120" | INI_SYSTEM |
注意:
使用 open_basedir 將會停用 realpath 快取。
以下是對組態指令的簡短說明。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
arg_separator.output | "&" | INI_ALL |
|
arg_separator.input | "&" | INI_PERDIR |
|
variables_order | "EGPCS" | INI_PERDIR |
|
request_order | "" | INI_PERDIR |
|
auto_globals_jit | "1" | INI_PERDIR |
|
register_argc_argv | "1" | INI_PERDIR |
|
enable_post_data_reading | "1" | INI_PERDIR |
|
post_max_size | "8M" | INI_PERDIR |
|
auto_prepend_file | NULL | INI_PERDIR |
|
auto_append_file | NULL | INI_PERDIR |
|
default_mimetype | "text/html" | INI_ALL |
|
default_charset | "UTF-8" | INI_ALL |
|
input_encoding | "" | INI_ALL |
|
output_encoding | "" | INI_ALL |
|
internal_encoding | "" | INI_ALL |
以下是對組態指令的簡短說明。
arg_separator.output
string在 PHP 產生的 URL 中用於分隔引數的分隔符號。
arg_separator.input
stringPHP 用於將輸入 URL 解析為變數的分隔符號列表。
注意:
此指令中的每個字元都會被視為分隔符號!
variables_order
string設定 EGPCS(E
nvironment(環境)、G
et(取得)、P
ost(發布)、C
ookie 和 S
erver(伺服器))變數的解析順序。例如,如果 variables_order 設定為 "SP"
,則 PHP 會建立超全域變數 $_SERVER 和 $_POST,但不會建立 $_ENV、$_GET 和 $_COOKIE。設定為 "" 表示不會設定任何超全域變數。
在 CGI 和 FastCGI SAPI 中,$_SERVER 也會由環境中的值填入;無論 E
在此指令中其他位置的放置方式為何,S
始終等同於 ES
。
注意:
$_REQUEST 的內容和順序也會受到此指令的影響。
request_order
string此指令描述 PHP 將 GET、POST 和 Cookie 變數註冊到 _REQUEST 陣列中的順序。註冊是從左到右完成的,較新的值會覆蓋較舊的值。
如果未設定此指令,則會使用 variables_order 來取得 $_REQUEST 的內容。
請注意,由於安全疑慮,預設發行版的 php.ini 檔案不包含 Cookie 的 'C'
。
auto_globals_jit
bool啟用後,SERVER、REQUEST 和 ENV 變數會在第一次使用時建立(即時),而不是在腳本啟動時建立。如果這些變數未在腳本中使用,則啟用此指令會帶來效能提升。
會在編譯期間檢查 SERVER、REQUEST 和 ENV 變數的使用情況,因此透過例如變數變數 使用它們不會導致它們初始化。
register_argc_argv
boolenable_post_data_reading
boolpost_max_size
intpost_max_size
。 當使用 int 時,值是以位元組為單位測量的。也可以使用 此 FAQ 中描述的速記符號。 如果發布資料的大小大於 post_max_size,則 $_POST 和 $_FILES 超全域變數為空。這可以透過各種方式進行追蹤,例如,將 $_GET 變數傳遞給處理資料的腳本,即 <form action="edit.php?processed=1">
,然後檢查是否設定了 $_GET['processed']。
注意:
PHP 允許位元組值的快捷方式,包括 K(千)、M(兆)和 G(吉)。如果您使用這些中的任何一個,PHP 會自動執行轉換。請小心不要超過 32 位元帶正負號的整數限制(如果您使用的是 32 位元版本),因為它會導致腳本失敗。
版本 | 描述 |
---|---|
5.3.4 |
當內容類型為 application/x-www-form-urlencoded 或未在 PHP 中註冊時,post_max_size = 0 不會停用限制。 |
5.3.2 , 5.2.12 | 透過將 post_max_size 設定為 0 來允許無限制的發布大小。 |
auto_prepend_file
string指定在主要檔案之前自動解析的檔案名稱。該檔案的包含方式如同呼叫 require 函數一樣,因此會使用 include_path。
特殊值 none
會停用自動前置處理。
auto_append_file
string指定在主要檔案之後自動解析的檔案名稱。該檔案的包含方式如同呼叫 require 函數一樣,因此會使用 include_path。
特殊值 none
會停用自動附加處理。
注意:如果腳本以 exit() 終止,則不會發生自動附加處理。
default_mimetype
string預設情況下,PHP 會使用 Content-Type 標頭輸出媒體類型。若要停用此功能,只需將其設定為空白即可。
PHP 的內建預設媒體類型設定為 text/html。
default_charset
string"UTF-8" 是預設值,如果省略 encoding
參數,則其值會用作 htmlentities()、html_entity_decode() 和 htmlspecialchars() 的預設字元編碼。default_charset
的值也會用來設定 iconv 函數的預設字元集(如果未設定 iconv.input_encoding
、iconv.output_encoding
和 iconv.internal_encoding
設定選項),以及 mbstring 函數的預設字元集(如果未設定 mbstring.http_input
mbstring.http_output
mbstring.internal_encoding
設定選項)。
如果標頭未被對 header() 的呼叫覆寫,則所有版本的 PHP 都會使用此值作為 PHP 所傳送預設 Content-Type 標頭中的字元集。
不建議將 default_charset
設定為空值。
input_encoding
string此設定用於多位元組模組,例如 mbstring 和 iconv。預設為空。
output_encoding
string此設定用於多位元組模組,例如 mbstring 和 iconv。預設為空。
internal_encoding
string此設定用於多位元組模組,例如 mbstring 和 iconv。預設為空。如果為空,則會使用 default_charset。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
include_path | ".;/path/to/php/pear" | INI_ALL |
|
open_basedir | NULL | INI_ALL |
|
doc_root | NULL | INI_SYSTEM |
|
user_dir | NULL | INI_SYSTEM |
|
user_ini.cache_ttl | "300" | INI_SYSTEM |
|
user_ini.filename | ".user.ini" | INI_SYSTEM |
|
extension_dir | "/path/to/php" | INI_SYSTEM |
|
extension | NULL | php.ini only | |
zend_extension | NULL | php.ini only | |
cgi.check_shebang_line | "1" | INI_SYSTEM |
|
cgi.discard_path | "0" | INI_SYSTEM |
|
cgi.fix_pathinfo | "1" | INI_SYSTEM |
|
cgi.force_redirect | "1" | INI_SYSTEM |
|
cgi.nph | "0" | INI_SYSTEM |
|
cgi.redirect_status_env | NULL | INI_SYSTEM |
|
cgi.rfc2616_headers | "0" | INI_ALL |
|
fastcgi.impersonate | "0" | INI_SYSTEM |
|
fastcgi.logging | "1" | INI_SYSTEM |
以下是對組態指令的簡短說明。
include_path
string指定 require、include、fopen()、file()、readfile() 和 file_get_contents() 函數尋找檔案的目錄清單。格式類似於系統的 PATH 環境變數:以 Unix 中的冒號或 Windows 中的分號分隔的目錄清單。
PHP 會在尋找要包含的檔案時,單獨考慮包含路徑中的每個項目。它會檢查第一個路徑,如果找不到,則檢查下一個路徑,直到找到包含的檔案或傳回 E_WARNING
或 E_ERROR
。您可以使用 set_include_path() 在執行階段修改或設定您的包含路徑。
範例 #1 Unix include_path
include_path=".:/php/includes"
範例 #2 Windows include_path
include_path=".;c:\php\includes"
在包含路徑中使用 .
允許相對包含,因為它表示目前的目錄。但是,明確使用 include './file'
比讓 PHP 始終檢查每個包含的目前目錄更有效率。
注意:
在 .ini 檔案中也可以存取
ENV
變數。因此,可以使用${LOGIN}
和${USER}
來參考使用者目錄。伺服器 API 之間的環境變數可能有所不同,因為這些環境可能不同。
範例 #3:使用 ${USER} 環境變數的 Unix include_path
include_path = ".:${USER}/pear/php"
open_basedir
string限制 PHP 可以存取的檔案僅限於指定的目錄樹,包括檔案本身。
當腳本嘗試存取檔案系統時,例如使用 include 或 fopen(),會檢查檔案的位置。當檔案位於指定的目錄樹之外時,PHP 將拒絕存取它。所有符號連結都會被解析,因此無法使用符號連結來避免此限制。如果檔案不存在,則符號連結無法解析,並且會將檔案名稱與(已解析的)open_basedir 進行比較。
open_basedir 不僅會影響檔案系統函數;例如,如果 MySQL
設定為使用 mysqlnd
驅動程式,則 LOAD DATA INFILE
將會受到 open_basedir 的影響。PHP 的許多擴充功能都以這種方式使用 open_basedir
。
特殊值 .
表示腳本的工作目錄將被用作基礎目錄。但是,這有點危險,因為腳本的工作目錄很容易使用 chdir() 來變更。
在 httpd.conf 中,可以使用 "php_admin_value open_basedir none
" 以與其他設定指令相同的方式關閉 open_basedir(例如,針對某些虛擬主機)。
在 Windows 下,使用分號分隔目錄。在所有其他系統上,使用冒號分隔目錄。作為 Apache 模組,父目錄的 open_basedir 路徑現在會自動繼承。
使用 open_basedir 指定的限制是目錄名稱,而不是前綴。
預設是允許開啟所有檔案。
注意: open_basedir 可以在執行階段收緊限制。這表示如果 open_basedir 在 php.ini 中設定為
/www/
,腳本可以在執行階段使用 ini_set() 將設定收緊為/www/tmp/
。在列出多個目錄時,無論作業系統為何,您都可以使用PATH_SEPARATOR
常數作為分隔符號。 自 PHP 8.3.0 起,當使用 ini_set() 在執行階段設定時,open_basedir 不再接受包含父目錄 (..
) 的路徑。
注意:
使用 open_basedir 會將 realpath_cache_size 設定為
0
,因此會停用 realpath 快取。
open_basedir
只是一個額外的安全防護網,並非全面性,因此在需要安全性時不能依賴它。
doc_root
stringPHP 在伺服器上的「根目錄」。僅在非空時使用。如果 PHP 編譯時未使用 FORCE_REDIRECT,則如果您在任何網頁伺服器(IIS 除外)下以 CGI 執行 PHP,則應該設定 doc_root。另一種選擇是使用下面的 cgi.force_redirect 設定。
user_ini.cache_ttl
int
user_ini.filename
string
user_dir
string使用者主目錄上用於 PHP 檔案的目錄基本名稱,例如 public_html 。
extension_dir
stringextension
stringPHP 啟動時要載入哪些可動態載入的擴充功能。
zend_extension
stringPHP 啟動時要載入的可動態載入 Zend 擴充功能名稱(例如 XDebug)。
cgi.check_shebang_line
bool控制 CGI PHP 是否檢查執行腳本頂端以 #!
(shebang) 開頭的行。如果腳本支援以獨立腳本和透過 PHP CGI 執行,則可能需要此行。如果此指令已開啟,則 CGI 模式中的 PHP 會跳過此行並忽略其內容。
cgi.discard_path
bool如果啟用此選項,則 PHP CGI 二進制檔案可以安全地放置在網頁樹之外,並且人們將無法規避 .htaccess 安全性。
cgi.fix_pathinfo
bool為 CGI 提供真正的 PATH_INFO
/ PATH_TRANSLATED
支援。PHP 先前的行為是將 PATH_TRANSLATED
設定為 SCRIPT_FILENAME
,並且不理解 PATH_INFO
是什麼。有關 PATH_INFO
的更多資訊,請參閱 CGI 規格。將此設定為 1
將導致 PHP CGI 修正其路徑以符合規格。設定為零會使 PHP 的行為與以前相同。預設情況下會開啟此選項。您應該修正您的腳本以使用 SCRIPT_FILENAME
而不是 PATH_TRANSLATED
。
cgi.force_redirect
boolcgi.force_redirect 對於在大多數網頁伺服器下以 CGI 執行 PHP 時提供安全性是必要的。如果未定義,PHP 預設會開啟此選項。您可以自行承擔風險將其關閉。
注意:
Windows 使用者:使用 IIS 時,必須關閉此選項。對於 OmniHTTPD 或 Xitami,情況也一樣。
cgi.nph
bool如果啟用 cgi.nph,則會強制 cgi 始終在每次請求時傳送 Status: 200。
cgi.redirect_status_env
string如果開啟 cgi.force_redirect,並且您不是在 Apache 或 Netscape (iPlanet) 網頁伺服器下執行,則您可能需要設定 PHP 將尋找的環境變數名稱,以知道繼續執行是沒有問題的。
注意:
設定此變數可能會導致安全性問題,請先了解您正在做什麼。
cgi.rfc2616_headers
int告知 PHP 在傳送 HTTP 回應代碼時要使用哪種標頭類型。如果設定為 0,PHP 會傳送 » RFC 3875「Status:」標頭,該標頭受 Apache 和其他網頁伺服器支援。當此選項設定為 1 時,PHP 將傳送 » RFC 2616 相容的標頭。
如果啟用此選項,並且您在 CGI 環境(例如 PHP-FPM)中執行 PHP,則您不應使用標準 RFC 2616 樣式的 HTTP 狀態回應標頭,而應使用其 RFC 3875 對應標頭,例如,而不是 header("HTTP/1.0 404 Not found"); 您應該使用 header("Status: 404 Not Found");
除非您知道自己在做什麼,否則請將其設定為 0。
fastcgi.impersonate
stringIIS 下的 FastCGI (在基於 WINNT 的作業系統上) 支援模擬呼叫用戶端的安全令牌的功能。這允許 IIS 定義執行請求的安全內容。Apache 下的 mod_fastcgi 目前不支援此功能 (2002 年 3 月 17 日)。如果在 IIS 下執行,請設定為 1。預設值為零。
fastcgi.logging
bool使用 FastCGI 時開啟 SAPI 日誌記錄。預設為啟用日誌記錄。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
file_uploads | "1" | INI_SYSTEM |
|
upload_tmp_dir | NULL | INI_SYSTEM |
|
max_input_nesting_level | 64 | INI_PERDIR |
|
max_input_vars | 1000 | INI_PERDIR |
|
upload_max_filesize | "2M" | INI_PERDIR |
|
max_file_uploads | 20 | INI_PERDIR |
以下是對組態指令的簡短說明。
file_uploads
bool是否允許 HTTP 檔案上傳。另請參閱 upload_max_filesize、upload_tmp_dir 和 post_max_size 指令。
upload_tmp_dir
string用於在執行檔案上傳時儲存檔案的暫存目錄。必須可由執行 PHP 的任何使用者寫入。如果未指定,PHP 將使用系統的預設值。
如果此處指定的目錄不可寫入,PHP 會回復為系統預設的暫存目錄。如果 open_basedir 已開啟,則必須允許系統預設目錄才能成功上傳。
upload_max_filesize
int上傳檔案的最大大小。
post_max_size 必須大於此值。
當使用 int 時,該值以位元組為單位測量。也可以使用此常見問題中描述的簡寫符號。max_file_uploads
int允許同時上傳的最大檔案數。提交時留空的上傳欄位不計入此限制。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
sql.safe_mode | "0" | INI_SYSTEM |
已於 PHP 7.2.0 移除 |
以下是對組態指令的簡短說明。
sql.safe_mode
bool如果啟用,指定預設值的資料庫連線函式將會使用這些預設值,取代任何使用者提供的引數。關於預設值的詳細資訊,請參閱相關連線函式的說明文件。
此功能已於 PHP 7.2.0 版本移除。
名稱 | 預設值 | 可變更 | 變更日誌 |
---|---|---|---|
windows.show_crt_warning | "0" | INI_ALL |
以下是對組態指令的簡短說明。
windows.show_crt_warning
bool啟用此指令時,將會顯示 Windows CRT 警告。
使用 auto_prepend_file 時請小心。
當由 set_exception_handler() 設定的自訂例外處理常式處理未捕獲的例外時,它會中斷每個腳本的執行。
然而,如果帶有未處理異常的腳本是自動前置或由自動前置的腳本包含的,則主腳本仍會繼續執行。
這可能會導致一些問題:當我們認為拋出異常會自動中斷目前的應用程式時,仍然會執行一整塊程式碼。
關於 upload_tmp_dir 設定和 UNC 路徑的注意事項
當在 Windows 作業系統和 IIS FastCGI 上使用 PHP 時,如果您需要為 upload_tmp_dir 設定使用網路磁碟機上資料夾的 UNC 路徑,則必須在 UNC 路徑的前面使用三個 \ 字元。
Windows 和 PHP 將第一個斜線用作跳脫字元,因此如果您只使用兩個斜線,則會傳遞一個只有一個反斜線的 UNC 路徑。這對於 UNC 路徑無效,並且在上傳檔案時可能會遇到問題,例如錯誤顯示「PHP 缺少臨時資料夾」。
正確
upload_tmp_dir = "\\\path\to\your\folder"
不正確
upload_tmp_dir = "\\path\to\your\folder"
如果有人碰巧維護使用 UTF-8 以外的字元集的舊應用程式,這可能會有所幫助。
根據文件,如果您使用 `header()`,則可以覆寫預設字元集。
假設 php.ini 將 default_charset 設定為「UTF-8」,但您需要一個舊版字元集,例如 ISO-8859-1。
但是,
<?php header('Content-Type: text/html; Charset=ISO-8859-1'); ?>
不會覆寫字元集,只會將它也加入,結果
是像這樣的回應標頭(請注意兩個字元集)
Content-Type:"text/html; Charset=ISO-8859-1;charset=UTF-8"
我發現預設的字元集是帶有小寫 `c` 的 `charset` 很奇怪
與我的自訂字元集帶有大寫 `C` 相反。
解決方案是使用所有小寫字母來 _覆寫_ 字元集
對於「charset」這個詞也一樣
<?php header('content-type: text/html; charset=ISO-8859-1'); ?>
然後,回應標頭中的雙字元集消失了,只剩下了單個自訂字元集。
如果目錄不存在或使用者沒有存取權限,您會收到誤導性的錯誤訊息。
open_basedir 限制生效。檔案 (/tmp/php_session) 不在允許的路徑中:/tmp/php_session
「如果 post 資料的大小大於 post_max_size...」
似乎更優雅的方式是比較 post_max_size 和 $_SERVER['CONTENT_LENGTH']。請注意,後者不僅包含上傳檔案的大小加上 post 資料,還包括 multipart 序列。 Leo
如果您使用 Microsoft IIS Windows 並想將 open_basedir 限制與多個目錄一起使用,則必須將它們放入 IIS 的主要組態 xml 檔案 (C:\Windows\System32\inetsrv\config\applicationHost.config) 的單引號中。在 IIS 10 中運作良好。
帶有單引號的多個檔案,並用 ; 分隔,用於 Windows
"C:\php\php-cgi.exe|-d open_basedir='C:\Windows\Temp\;D:\mywebsite1\'"
只有一個目錄在沒有單引號的情況下可以正常運作
"C:\php\php-cgi.exe|-d open_basedir=D:\mywebsite1\"
在我的 IIS 主要組態 xml 檔案中,每個網站都有 2 個節點要設定,並且定義必須相同
configuration\Location\system.webServer\handlers\add
configuration\system.webServer\fastCgi
我在 php.ini 中遇到 'open_basedir =' 字串的問題。這個字串是在 Apache2 的 VirtualHost Directory 指令中撰寫的,並且成功地覆寫了相同的 php.ini 設定!這發生在 VestaCP 中,但我認為這是一種常見的方式。祝您好運!
看來,如果您同時使用 'include_path' 指令和 'open_basedir',則檔案搜尋將會 *先* 命中 include 路徑,然後才會命中本機檔案。但是,如果未使用 'open_basedir',則會先找到本機檔案。例如,假設您在 '/var/www/myfile.php' 中有程式碼,它會執行
<?php
require_once('config.php');
?>
此外,假設有一個本機檔案 '/var/www/config.php',並且還有一個檔案 '/var/local/php/config.php'。
接下來,如果您的 php.ini 有
include_path = /var/local/php/
通常,這會先尋找 '/var/www/config.php',如果找不到,則會嘗試 '/var/local/php/config.php'。
但是,如果您在 php.ini 中也有此設定
open_basedir = /var/www/:/var/local/php/
那麼 require 將會反轉搜尋的順序,並載入 '/var/local/php/config.php',即使本機的 'config.php' 檔案存在。
此外,如果 include_path 包含不在 open_basedir 中的目錄,您可能會導致嚴重錯誤。例如,將指令變更為
open_basedir = /var/www/:/var/local/includes/php/
現在,require 將會先從 include_path 中找到 '/var/local/php/config.php',嘗試包含它,但由於 open_basedir 限制而無法包含。