PHP 日本研討會 2024

核心 php.ini 指令說明

此列表包含您可以設定以組態您的 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 string
此指令允許停用某些函式。它接受逗號分隔的函式名稱清單。自 PHP 8.0.0 起,停用函式會移除其定義,允許使用者空間重新定義它。在 PHP 8.0.0 之前,停用函式只會阻止調用該函式。 只有 內部函式可以使用此指令停用。使用者定義的函式不受影響。 此指令必須在 php.ini 中設定。它不能在 httpd.conf 中設定。
disable_classes string

此指令允許停用某些類別。它接受逗號分隔的類別名稱清單。停用類別只會阻止實例化該類別。

只有內部類別可以使用此指令停用。使用者定義的類別不受影響。

此指令必須在 php.ini 中設定。它不能在 httpd.conf 中設定。
zend.assertions int
當設定為 1 時,將會產生並執行斷言程式碼(開發模式)。當設定為 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

當使用 int 時,該值以位元組為單位測量。也可以使用此常見問題中描述的簡寫符號。

另請參閱: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 快取。

以下是對組態指令的簡短說明。

realpath_cache_size int

決定 PHP 要使用的 realpath 快取大小。在 PHP 開啟許多檔案的系統上,應該增加此值,以反映執行的檔案操作量。

大小代表儲存的路徑字串總位元組數,加上快取項目相關資料的大小。這表示為了在快取中儲存較長的路徑,快取大小必須更大。此值不會直接控制可以快取的不同路徑數量。

快取項目資料所需的大小會因系統而異。

realpath_cache_ttl int

快取指定檔案或目錄的 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 string

PHP 用於將輸入 URL 解析為變數的分隔符號列表。

注意:

此指令中的每個字元都會被視為分隔符號!

variables_order string

設定 EGPCS(Environment(環境)、Get(取得)、Post(發布)、Cookie 和 Server(伺服器))變數的解析順序。例如,如果 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 bool
告知 PHP 是否宣告 argv 和 argc 變數(其中包含 GET 資訊)。另請參閱命令列
enable_post_data_reading bool
停用此選項會導致 不會 填入 $_POST$_FILES。然後,讀取發布資料的唯一方法將是透過php://input 資料流包裝器。這對於代理請求或以記憶體有效的方式處理 POST 資料非常有用。
post_max_size int
設定允許的發布資料最大大小。此設定也會影響檔案上傳。若要上傳大型檔案,此值必須大於 upload_max_filesize 一般來說,memory_limit 應該大於 post_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 位元版本),因為它會導致腳本失敗。

post_max_size 的變更記錄
版本 描述
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_encodingiconv.output_encodingiconv.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

指定 requireincludefopen()file()readfile()file_get_contents() 函數尋找檔案的目錄清單。格式類似於系統的 PATH 環境變數:以 Unix 中的冒號或 Windows 中的分號分隔的目錄清單。

PHP 會在尋找要包含的檔案時,單獨考慮包含路徑中的每個項目。它會檢查第一個路徑,如果找不到,則檢查下一個路徑,直到找到包含的檔案或傳回 E_WARNINGE_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 可以存取的檔案僅限於指定的目錄樹,包括檔案本身。

當腳本嘗試存取檔案系統時,例如使用 includefopen(),會檢查檔案的位置。當檔案位於指定的目錄樹之外時,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 string

PHP 在伺服器上的「根目錄」。僅在非空時使用。如果 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 string

PHP 應該在哪個目錄中尋找可動態載入的擴充功能。建議指定絕對路徑。另請參閱:enable_dldl()

extension string

PHP 啟動時要載入哪些可動態載入的擴充功能。

zend_extension string

PHP 啟動時要載入的可動態載入 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 bool

cgi.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 string

IIS 下的 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_filesizeupload_tmp_dirpost_max_size 指令。

upload_tmp_dir string

用於在執行檔案上傳時儲存檔案的暫存目錄。必須可由執行 PHP 的任何使用者寫入。如果未指定,PHP 將使用系統的預設值。

如果此處指定的目錄不可寫入,PHP 會回復為系統預設的暫存目錄。如果 open_basedir 已開啟,則必須允許系統預設目錄才能成功上傳。

upload_max_filesize int

上傳檔案的最大大小。

post_max_size 必須大於此值。

當使用 int 時,該值以位元組為單位測量。也可以使用此常見問題中描述的簡寫符號。
max_file_uploads int

允許同時上傳的最大檔案數。提交時留空的上傳欄位不計入此限制。

一般 SQL

一般 SQL 設定選項
名稱 預設值 可變更 變更日誌
sql.safe_mode "0" INI_SYSTEM 已於 PHP 7.2.0 移除

以下是對組態指令的簡短說明。

sql.safe_mode bool

如果啟用,指定預設值的資料庫連線函式將會使用這些預設值,取代任何使用者提供的引數。關於預設值的詳細資訊,請參閱相關連線函式的說明文件。

警告

此功能已於 PHP 7.2.0 版本移除

Windows 特有

Windows 特有組態選項
名稱 預設值 可變更 變更日誌
windows.show_crt_warning "0" INI_ALL  

以下是對組態指令的簡短說明。

windows.show_crt_warning bool

啟用此指令時,將會顯示 Windows CRT 警告。

新增筆記

使用者提供的筆記 9 則筆記

luisdev
4 年前
https://haydenjames.io/understanding-php-memory_limit/ 很好地說明了 memory_limit 設定。
Simone Pellegatta
3 年前
使用 auto_prepend_file 時請小心。

當由 set_exception_handler() 設定的自訂例外處理常式處理未捕獲的例外時,它會中斷每個腳本的執行。

然而,如果帶有未處理異常的腳本是自動前置或由自動前置的腳本包含的,則主腳本仍會繼續執行。

這可能會導致一些問題:當我們認為拋出異常會自動中斷目前的應用程式時,仍然會執行一整塊程式碼。
diamondeagle at webmail dot co dot za
5 年前
關於 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"
fernandobasso dot br at gmail dot com
8 年前
如果有人碰巧維護使用 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'); ?>

然後,回應標頭中的雙字元集消失了,只剩下了單個自訂字元集。
gcb@
5 個月前
如果目錄不存在或使用者沒有存取權限,您會收到誤導性的錯誤訊息。

open_basedir 限制生效。檔案 (/tmp/php_session) 不在允許的路徑中:/tmp/php_session
leo at korfu dot cz
18 年前
「如果 post 資料的大小大於 post_max_size...」

似乎更優雅的方式是比較 post_max_size 和 $_SERVER['CONTENT_LENGTH']。請注意,後者不僅包含上傳檔案的大小加上 post 資料,還包括 multipart 序列。 Leo
andre dot wetter at myelco dot ch
3 年前
如果您使用 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
Anton Bannikov
4 年前
我在 php.ini 中遇到 'open_basedir =' 字串的問題。這個字串是在 Apache2 的 VirtualHost Directory 指令中撰寫的,並且成功地覆寫了相同的 php.ini 設定!這發生在 VestaCP 中,但我認為這是一種常見的方式。祝您好運!
dougal at gunters dot org
8 年前
看來,如果您同時使用 '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 限制而無法包含。
To Top