PHP运行为Apache模块以提供网页的
memory_limit
配置应考虑您可以在机器上同时拥有多少个Apache进程--请参见Apache的
MaxClients
配置选项。如果
MaxClients
是100并且您有2,000 MB的RAM,则非常快速的计算将显示您不应使用超过20 MB(因为20 MB * 100个客户端= 2 GB或RAM,即服务器总内存量)的
memory_limit
值。这还没有考虑到可能在同一台服务器上运行其他东西,如MySQL,系统本身等,而且Apache可能已经在使用一些内存。
当然,这也是一个“最坏情况”,考虑到每个PHP页面都在使用它可以使用的最大内存量。
如果您只需要一个作业使用如此大量的内存,我不会增加运行为Apache模块的PHP的
memory_limit
。
相反,我会从命令行(或通过cron作业)启动该作业,并在这种唯一的情况下指定更高的
memory_limit
。
这可以使用php的
-d
选项完成,例如:
$ php -d memory_limit=1GB temp.php
string(3) "1GB"
考虑到这种情况,temp.php仅包含:
var_dump(ini_get('memory_limit'));
在我看来,这比增加Apache PHP模块的memory_limit更安全--当我有一个大数据集或一些我无法优化或分页的重型内容时,通常会这样做。
如果您需要为PHP CLI执行定义多个值,也可以使用-c
选项告诉它使用另一个配置文件,而不是默认的php.ini文件:
php -c /etc/phpcli.ini temp.php
这种方式,你有:
/etc/php.ini
用于 Apache,内存限制 (memory_limit
) 低,最长执行时间 (max_execution_time
) 短...
- 和
/etc/phpcli.ini
用于从命令行运行的批处理程序,几乎没有限制
这确保你的批处理程序能够运行 - 你的网站仍然有安全保障 (memory_limit
和 max_execution_time
是安全措施)
然而,如果你有时间优化你的脚本,你应该这样做;例如,在需要处理大量数据的情况下,分页是必须的 ;-)