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


24

在RHEL 7.7下运行PHP版本7.1.30。

我想提高memory_limit,但不确定我是否具有正确的语法(即256M或256MB)。因此,我首先在memory_limit设置中输入了一个错误的值“ Hugo”。麻烦的是phpinfo()(在httpd下运行)的结果,字面上有字符串“ Hugo”,即:

在此处输入图片说明

因此,这让我有些担心,PHP实际上并未对值进行任何合理性检查。(如果提供的值不正确,我希望它恢复为默认值,例如)

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


4
很好的问题。
修补

3
从这里:php.net/manual/en/faq.using.php#faq.using.shorthandbytes我认为它与相同(int) 'HUGO'; // => 0。在使用2MB内存的计算机上,这开始失败。
Yoshi

为了记录在案,正确的语法是memory_limit 256M
跳跳虎

@Yoshi我想你应该公开你的答案。这是一个很好的解释
Maksym Fedorov

@MaksymFedorov我很犹豫,因为我没有真正的参考。目前,这只是一个观察。
Yoshi

Answers:


19

令人困惑的是,该设置看起来像带有某些特殊语法的整数,但在内部定义为字符串。然后,只要更改值,该字符串就会被解析为单独的全局变量。至关重要的是,将字符串解析为整数的结果不会保存回设置表,因此,在调用时phpinfo(),您会看到原始输入,而不是解析后的值。

您可以在源代码中看到此内容:

支持的语法最终在中定义zend_atol,其中:

  1. 解析字符串以获取数值,忽略任何其他文本
  2. 着眼于字符串的最后一个字符,并乘前面的值,如果是gGmMk,或者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

感谢@IMSoP的出色评价。一个人应该在任何类型的bugtracker中报告这种事情吗?我发现phpinfo()会产生高度违反直觉的响应。而且,当遇到意外值时,php所做的一些调试输出也不会出错。
修补

1
@tink我想您可以在bugs.php.net上提出功能请求,或将消息发送到Internals邮件列表,这是大多数协调发生的地方。我在几年前发现了类似的要求,但似乎没有任何回应。
IMSoP

再次感谢,将调查!:)
修补

0

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

当与PHP函数一起使用时,您必须执行以下操作 ini_set(‘memory_limit’,’256MB’)。因此,此函数将暂时将您的值设置为解释器变量。如果您看得更近,则可以看到两列,一列表示本地,一列表示全局。这分别显示了个人的价值能力。

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


3
我要指出的是,OP并未询问如何设置内存限制:)
Karolis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.