我有一堆客户端销售点(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的最大脚本执行时间,但它仍然出错。


当前回答

你可以通过修改fastcgi/fpm的memory_limit来解决这个问题:

$vim /etc/php5/fpm/php.ini

更改内存,例如从128更改为512,如下所示

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

to

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M

其他回答

在我的情况下,mac (Catalina - Xampp)没有加载文件,所以我必须先这样做。

sudo cp /etc/php.ini.default /etc/php.ini
sudo nano /etc/php.ini

然后修改memory_limit = 512M

然后重新启动Apache,检查文件是否加载

php -i | grep php.ini

结果是

Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

最后检查

php -r "echo ini_get('memory_limit').PHP_EOL;"

正确的方法是编辑你的php.ini文件。 将memory_limit编辑为所需的值。

从你的问题来看,已经超过了128M(这是默认的限制),所以你的代码有严重的问题,它不应该占用那么多。

如果您知道为什么需要这么多,并且您希望允许它设置memory_limit = 512M或更高,那么您应该没问题。

在PHP脚本中很容易发生内存泄漏——特别是在使用抽象(如ORM)时。尝试使用Xdebug分析脚本并找出所有内存的去向。

只需添加一个ini_set('memory_limit', '-1');在你的网页顶部的行。

并且您可以根据需要将内存设置在-1的位置,设置为16M,等等。

您站点的根目录:

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