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


当前回答

如果你正在运行一个whm驱动的VPS(虚拟专用服务器),你可能会发现你没有权限直接编辑PHP.INI;系统必须这样做。在WHM主机控制面板,进入“服务配置→PHP配置编辑器”,修改memory_limit:

其他回答

改变;memory_limit = 512 ; memory_limit = 1 在

这对服务器来说太危险了 您的PHP代码可能在某个地方有内存泄漏,您告诉服务器只使用它想要的所有内存。你根本就解决不了问题。如果监视您的服务器,您将看到它现在可能正在使用大部分RAM,甚至正在切换到磁盘。

在我的例子中,这是一个简单的问题与函数的编写方式。给函数的输入变量赋一个新值可能会导致内存泄漏,例如:

/**
* Memory leak function that illustrates unintentional bad code
* @param $variable - input function that will be assigned a new value
* @return null
**/
function doSomehting($variable){
    $variable = 'set value';
    // Or
    $variable .= 'set value';
}

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

; 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

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

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

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

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

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