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

标签 php apache rhel

在 RHEL 7.7 下运行 PHP 7.1.30 版。

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

enter image description here

所以这让我有点担心 PHP 实际上并没有对值进行任何完整性检查。 (如果提供的值不好,我希望它恢复为默认值,例如)

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

最佳答案

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

你可以在源码中看到:

  • The setting is defined with a callback for when it is changed
  • The callback is fed the raw string value
  • The callback for that particular setting使用 a function called zend_atol 将字符串解析为整数, 处理特殊后缀
  • 然后它调用 a function which sets a global variable (“AG”的意思是“分配管理器全局变量”,宏用于管理线程安全,如果它被编译了)

  • 支持的语法最终定义在 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 - PHP 是否对 php.ini 文件进行任何解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59849538/

    相关文章:

    linux - Codeigniter URL 重写 .htaccess 在 CentOS 上不起作用

    oracle - 在 Linux 上使用 Oracle Apex 安装 RESTful 服务和 Tomcat 8

    java - RHEL 5/RHEL 6 上的 libfaketime 和 java

    php - 如何编写 htaccess 文件,更改 URL

    PHP > Zend 框架 > Zend_Money

    javascript - 从 php 执行 Perl 文件

    html - 在 Apache JMeter 中不记录 html 样本

    php - 如何在 Mac OsX 10.7.3 上安装和运行 wkhtmltopdf 以便在 PHP 应用程序中使用

    php - 使用浏览器时Redis不工作

    ruby - 如何在红帽上安装 Ruby