我的PHP脚本不断抛出“内存不足”

时间:2019-01-09 14:51:40

标签: php

我有一个php脚本,在下一行中不断抛出错误

base64_encode(serialize(array($data, $context)))

这是错误

  

内存不足(已分配471859200)(试图分配234607507)   字节)

我在调用base64_encode()方法之前添加了以下两行

set_time_limit(0);
ini_set('memory_limit', '-1');

如您所见,我为脚本提供了所有可用的物理内存(16GB)

什么可能导致此错误?

1 个答案:

答案 0 :(得分:0)

PHP产生两个与内存有关的错误消息:

  • 当超过memory_limit时,例如:

      

    允许的%zu字节内存容量已耗尽(尝试分配%zu字节)

  • 当PHP无法从操作系统获取更多内存时:

      

    内存不足(已分配%zu)(试图分配%zu字节)

...的措辞略有不同,具体取决于实际上下文(有关详细信息,请参见Zend\zend_alloc.c的PHP源代码)。

使用明喻,您可以用尽磁盘配额或磁盘可以装满。

第二种情况基本上是崩溃,如果在32位PHP进程中运行内存密集型任务,则相对容易找到。没有固定的规则,但是当您的需求接近1GB时,就会发生不好的事情。如果您determine正在运行32位PHP(操作系统体系结构无关紧要),即使没有,也可能要考虑重写。

我不知道您的用例,所以这些只是模糊的提示:

  • 我假设您base64_encode()将您的数据提交到其他地方。也许您不需要将全部数据保存在内存中,可以decode it in chunks随身携带并发送或存储在文件中。

  • 您可以将serialize()替换为可分块操作或切换为其他格式的替代实现。