[英]Does PHP do any parsing on the php.ini file?
這里令人困惑的是,該設置看起來像一個具有某種特殊語法的整數,但在內部定義為一個字符串。 每當值發生變化時,該字符串就會被解析為一個單獨的全局變量。 至關重要的是,將字符串解析為整數的結果不會保存回設置表,因此當您調用phpinfo()
時,您看到的是原始輸入,而不是解析后的值。
您可以在源代碼中看到這一點:
zend_atol
的函數將字符串解析為整數,該函數處理特殊后綴 支持的語法最終在zend_atol
中定義,其中:
g
、 G
、 m
、 M
、 k
或K
則乘以前面的值開頭沒有數字的值將被解析為零。 設置全局變量時,這將根據常量ZEND_MM_CHUNK_SIZE
將內存限制設置為允許的最小值。
您可以通過設置內存限制來查看效果,然后運行一個快速分配大量內存的循環並查看錯誤消息中出現的內容。 例如:
# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 2097152 bytes exhausted
# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 4000000 bytes exhausted
# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 4194304 bytes exhausted
首先,我們首先需要了解 PHP.ini 是如何以解釋工作流的方式工作的。 memory_limit 是 PHP 的指令。
使用 PHP 函數時,您必須執行類似ini_set('memory_limit','256MB')
操作。 因此,此函數會暫時將您的值設置為解釋器變量。 如果你看得更近一些,那么你可以得到兩列,一列用於本地,一列用於全局。 這分別表明了價值觀對個人的能力。
但是,當您為全局定義時,您需要分別設置為 K、M、G 的后綴。 如果我們使用 apache .htaccess 超過此值,則 PHP fpm 需要相同的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.