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


当前回答

当你看到上面的错误-特别是如果(试图分配__字节)是一个低值,这可能是一个无限循环的指示符,就像一个函数调用自己没有出路:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

其他回答

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

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

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

启用这两行后,它开始工作:

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120

你可以通过修改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

当我从代码中删除以下行时,一切正常!

set_include_path(get_include_path() . get_include_path() . '/phpseclib');
include_once('Net/SSH2.php');
include_once('Net/SFTP.php');

这些行包含在我运行的每个文件中。当一个一个运行文件时,所有工作正常,但当一起运行所有文件时,我得到了内存泄漏问题。不知何故,“include_once”不包括事情一次,或者我做错了什么…

您站点的根目录:

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