簡體   English   中英

PHP 是否對 php.ini 文件進行任何解析?

[英]Does PHP do any parsing on the php.ini file?

在 RHEL 7.7 下運行 PHP 版本 7.1.30。

我想提高 memory_limit,但不確定語法是否正確(即 256M 或 256MB)。 所以首先我將一個錯誤的值“Hugo”作為 memory_limit 設置。 問題在於 phpinfo()(在 httpd 下運行)的結果字面意思是字符串“Hugo”,即:

在此處輸入圖像描述

所以這讓我有點擔心 PHP 實際上不會對值進行任何健全性檢查。 (如果提供的值不好,我希望它恢復為默認值,例如)

任何人都可以對此發表評論 - 特別是,您如何知道 PHP 是否會執行某些操作(如果可以提供任意字符串)。

這里令人困惑的是,該設置看起來像一個具有某種特殊語法的整數,但在內部定義為一個字符串。 每當值發生變化時,該字符串就會被解析為一個單獨的全局變量。 至關重要的是,將字符串解析為整數的結果不會保存回設置表,因此當您調用phpinfo()時,您看到的是原始輸入,而不是解析后的值。

您可以在源代碼中看到這一點:

支持的語法最終在zend_atol中定義,其中:

  1. 為數值解析字符串,忽略任何附加文本
  2. 查看字符串的最后一個字符,如果它是gGmMkK則乘以前面的值

開頭沒有數字的值將被解析為零。 設置全局變量時,這將根據常量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM