PHP 版本:PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli)
在 apache2 中使用:libapache2-mod-php5
PHP 的全局选项memory_limit
设置为512M
。到目前为止一切顺利。
现在脚本尝试分配超过此值,并因 memory_limit 而失败。到目前为止一切顺利。
但是现在发生了一件奇怪的事情。当我创建 .htacess 时,php_value memory_limit "1025M"
仅使用一个 echo 请求一个简单的 PHP 文件,系统日志中就会出现错误。
9 月 21 日 18:14:02 ccollard2 suhosin[8611]: 警报 - 脚本尝试将 memory_limit 增加到 1082130432 字节,超出允许值(攻击者“*******”,文件“/home/www-data/********/bla/test.php”,第 14 行)
但当我尝试将 php_value 设置为memory_limit "1024M"
no 时,输出中没有显示任何错误。因此,我尝试检查一些 suhosin 配置以了解此1024M
限制,但一无所获。
所以我最初的问题是:1024M
为什么即使全局选项设置为<1024M, 服务器也允许内存消耗?
我保证没有配置文件覆盖全局选项,并且 phpinfo() 显示全局设置的内存限制。 php 脚本不是这里的问题。它只是一个测试脚本。
**
更新:Suhosin 似乎具有 1024M 内存分配的默认值。
因此,用户可以使用 htaccess 将 memory_limit 设置为 1024M,而无需 htaccess 的通常全局限制。因此,使用注释限制,suhosin 具有 1024 的不可见限制,用户可以手动设置此限制。但如果不手动设置,通常的全局限制将限制用户脚本。
答案1
您提到.htaccess
- 但您的发布详细信息来自CLI
PHP 版本(PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli)
)。
如果CLI
版本使用不同的php.ini
(相当常见) - 那么这就是为什么你看不到定义1024MB
运行以下命令
php -i | grep -i php.ini
并将其与通过 Web 浏览器输出的文件进行比较,其中包含以下内容
<?php phpinfo();
如果路径php.ini
不同,这就是你的答案,你正在编辑错误的文件。
对于 Suhosin
内存限制有一个特定的设置,通常定义在/etc/php5/conf.d/20suhosin.ini
suhosin.memory_limit = 1024M
答案2
我现在找到了解决方案。
全局设置的memory_limit
作用类似于软限制。suhosin
限制是硬限制。没有脚本可以消耗超过 suhosin 允许的内存。
当 suhosin 的限制为 0 时,用户可以设置最高 1024M 的限制,suhosin 表示“不再消耗内存”。
只要用户脚本使用“ini_set”定义内存限制,当 suhosin 的内存限制为 0 时,它就不能超过软限制。但如果 suhosin 设置为特定的 M 整数,则不允许任何脚本消耗超过 suhosin 所说的内存。
概括
Suhosin 定义了内存限制的最大值。
通常memory_limit
定义限制,这是默认限制,可以使用.htacces
/覆盖ini_set
。Suhosinsuhosin.memory_limit = 0
或注释中定义了 1024M。