PHP内存不足导致致命错误:X字节的允许内存大小耗尽(尝试分配Y字节)

时间:2017-06-11 11:34:22

标签: php apache amazon-web-services amazon-ec2 amazon-rds-aurora

我正忙着将用PHP / MySQL编写的客户应用程序从Hetzner迁移到AWS。一切正常,但一些脚本。这些脚本编写得很糟糕,循环遍历数百万条记录,在每次循环运行中创建数百个局部变量,将每一行写入excel文件,打开另一个文件,编写状态更新并在每次循环运行中关闭文件。该脚本使用主Web应用程序中的shell_exec作为独立进程生成。

当我第一次在EC2上测试脚本时,由于我的EC2实例上的php memory_limit参数设置为128M,因此崩溃的速度非常快。错误类似于下面的错误:

Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

我将memory_limit128M增加到256M,然后再增加到512M,然后增加到1024M4096M,最终设置为{ {1}}了解问题所在。

将它设置为-1最初似乎有效,但它会冻结整个实例(t2.micro)。然后我意识到这是由于缺少交换空间而达到了系统内存限制,所以仅为了测试目的,我添加了-1的交换空间并将4GB设置为memory_limit。这确实按预期工作,脚本从未崩溃,但随着脚本的运行,它逐渐变慢。例如,它将前10%的记录写入excel文件的速度比50%后的10%快得多。所有这一切,我看着内存使用量扩大到6 GB。

以下是脚本运行时来自-1的屏幕截图:

enter image description here

enter image description here

我正在使用php安装的默认htop,但设置为-1的php.ini除外。

但是,当我在另一台服务器(在这种情况下是Hetzner共享主机)上运行此非常相同的脚本时,服务器会以某种方式限制内存使用情况,并且脚本在memory_limit上运行正常128M设置。虽然这不完全正确(正如服务器上的memory_limit所证实的),但它似乎不会在服务器上崩溃,因为内存/交换空间比我的EC2实例少得多。

以下是在Hetzner上运行的htop的屏幕截图:

enter image description here

enter image description here

enter image description here

第三个截图是在脚本结束时拍摄的 - 正如您所看到的,内存在开始和结束之间没有太大变化。以下是服务器的htop设置:

php.ini

数据库和代码库在两个实例中都是精确的副本。在两种情况下,生成的excel文件大小约为225MB。

那么,任何想法可能导致这种行为,我应该如何在我的EC2实例上修复它?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

EasyPHP-Devserver-17-depanne-erreur致命错误:允许的内存大小
的134217728字节已用尽(尝试分配471698889字节) C:\ Program档案 (x86)\ EasyPHP-Devserver-17 \ eds-binaries \ httpserver \ apache2425vc11x86x180705170153 \ eds-app-dashboard.php 在第77行

解决方案

在我的情况下,这是因为Easyphp试图加载太大的error.log文件。

删除 eds-binaries \ httpserver \ apache2418x160331124251 \ logs中的服务器 log 文件 测试正常