我有一堆客户端销售点(POS)系统,这些系统定期将新的销售数据发送到一个集中的数据库,该数据库将数据存储到一个大数据库中,以便生成报告。

客户机POS基于PHPPOS,我实现了一个模块,该模块使用标准XML-RPC库将销售数据发送到服务。服务器系统构建在CodeIgniter上,并为webservice组件使用XML-RPC和XML-RPC库。每当我发送大量的销售数据(从销售表中只有50行,从sales_items中单独的行用于销售中的每个项目),我得到以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M是php.ini中的默认值,但我认为这是一个巨大的数字。事实上,我甚至尝试过将这个值设置为1024M,它所做的只是花费更长的时间来出错。

至于我所采取的步骤,我已经尝试在服务器端禁用所有处理,并对其进行了修改,使其返回一个罐装响应,而不管输入是什么。但是,我认为问题出在数据的实际发送上。我甚至尝试过禁用PHP的最大脚本执行时间,但它仍然出错。


当前回答

使用收益率可能也是一个解决方案。参见生成器语法。

与其更改PHP.ini文件以获得更大的内存存储空间,有时在循环中实现yield可能会解决这个问题。yield所做的不是一次性转储所有数据,而是逐个读取数据,从而节省了大量内存使用。

其他回答

与其更改php.ini文件中的memory_limit值,不如在代码的某个部分可能会使用大量内存,您可以在该部分运行之前删除memory_limit,然后在该部分运行之后替换它。

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);

在我的情况下,它是一个完整的磁盘和mysql屎在自己。

在释放磁盘空间、修复数据库并重新启动Apache之后,我的站点重新工作了!

一些开车路过的孩子设法淹没了我的日志,填满了我在虚拟机中剩下的大约500个字节。: D

在Drupal 7中,您可以在sites/default文件夹中的settings.php文件中修改内存限制。在260行左右,你会看到:

ini_set('memory_limit', '128M');

即使您的php.ini设置足够高,如果没有在Drupal settings.php文件中设置,您将无法消耗超过128 MB的空间。

PHP 5.3+允许您通过在public_html文件夹中放置.user.ini文件来更改内存限制。 简单地创建上面的文件,并在其中键入以下一行:

memory_limit = 64M

一些cPanel主机只接受这个方法。

我在一个比以前工作的数据集更小的数据集上运行时出现了下面的错误。

致命错误:在C:\workspace\image_management.php的第173行中,允许的内存大小为134217728字节已耗尽(试图分配4096字节)

由于寻找故障把我带到了这里,我想我应该提到,在以前的回答中,它并不总是技术解决方案,而是一些更简单的东西。对我来说,是火狐。在我运行程序之前,它已经使用了1157 MB。

事实证明,我在一段时间内每次都在看一个50分钟的视频,这把事情搞砸了。这是一种专家们想都不用想就能纠正的修复方法,但对我这样的人来说,这是值得记住的。