【问题标题】:My PHP script keep throwing "Out of memory"我的 PHP 脚本不断抛出“内存不足”
【发布时间】:2019-01-09 14:51:40
【问题描述】:

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

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

这是错误

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

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

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

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

什么可能导致这个错误?

【问题讨论】:

  • 您使用的是 32 位 PHP 吗?解释器在物理上可以使用多少内存是有限制的。
  • 您的代码可能是导致问题的原因,但我看不到任何问题。
  • 看来$data 和/或$context 很大
  • @HerrSerker 是的。但是为什么我的脚本会内存不足?
  • @ÁlvaroGonzález 我想我使用的是 32 位。我检查了 phpinfo() 输出(PROCESSOR_ARCHITECTURE x86)

标签: php


【解决方案1】:

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() 替换为分块操作的替代实现或切换到另一种格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多