PHP 是否对 php.ini 文件进行任何解析?

2022-08-30 17:15:56

在 RHEL 7.7 下运行 PHP 版本 7.1.30。

我想碰到memory_limit,但不确定我的语法是否正确(即256M或256MB)。因此,首先,我将一个糟糕的值“Hugo”作为memory_limit设置。这样做的问题是phpinfo()(在httpd下运行)的结果字面上有字符串“Hugo”,即:

enter image description here

因此,这让我有点担心PHP实际上并没有对值进行任何健全性检查。(如果提供的值不好,我希望它恢复到默认值,例如

任何人都可以对此发表评论 - 特别是,您如何知道PHP是否会强制执行(如果可以提供任意字符串)。


答案 1

这里令人困惑的是,该设置看起来像一个具有一些特殊语法的整数,但在内部定义为字符串。然后,每当值更改时,该字符串都会被解析为单独的全局变量。至关重要的是,将字符串解析为整数的结果不会保存回设置表,因此当您调用 时,您会看到原始输入,而不是解析的值。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

答案 2

首先,我们首先需要了解PHP.ini如何在解释工作流中工作。memory_limit是PHP的指令。

与PHP函数一起使用时,您必须执行类似操作。因此,此函数将暂时将您的值设置为解释器变量。如果你看到更近,那么你会得到两列,一个是本地的,一个是全局的。这分别向个人展示了价值的能力。ini_set(‘memory_limit’,’256MB’)

但是,当您为全局定义时,您需要分别设置为带有K,M,G的后缀。如果我们使用apache .htaccess超过此值,则PHP fpm需要相同的值。


推荐