致命错误:允许134217728字节的内存大小用尽(CodeIgniter + XML-RPC)

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

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

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

128M是在php.ini的默认值,但我认为这是一个巨大的数字打破。 事实上,我甚至试图将这个值设置为1024M,而且所做的只是花费较长的时间才能出错。

至于我采取的步骤,我已经尝试禁用服务器端的所有处理,并已经操纵它返回一个jar头响应,无论input。 但是,我认为问题在于数据的实际发送。 我甚至尝试禁用PHP的最大脚本执行时间,它仍然错误。

人,通过ini_set('memory_limit', '-1');更改memory_limit ini_set('memory_limit', '-1'); 根本不是一个解决scheme。

请不要这样做。 很明显,PHP有一个内存泄漏的地方,你告诉服务器只使用它想要的所有内存。 问题一直没有得到解决。 如果你监视你的服务器,你会发现它现在可能已经使用了大部分RAM甚至是交换到磁盘。

你可能应该尝试追踪代码中的确切错误并修复它。

ini_set('memory_limit', '-1'); 覆盖默认的PHP内存限制 。

正确的方法是编辑你的php.ini文件。 将memory_limit编辑为您的愿望值。

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

如果你知道为什么需要这么多,你想让它设置memory_limit = 512M或更高,你应该是好的。

PHP的内存分配可以永久或暂时调整。

永久

您可以永久更改PHP内存分配两种方式。

如果您有权访问您的php.ini文件,则可以将memory_limit的值编辑为您的愿望值。

如果您无法访问您的php.ini文件(并且您的虚拟主机允许),则可以通过.htaccess文件覆盖内存分配。 添加php_value memory_limit 128M (或任何你想要的分配)。

临时

您可以从PHP文件中随时调整内存分配。 你只需要代码ini_set('memory_limit', '128M'); (或任何你想要的分配)。 您可以通过将值设置为“-1”来删除内存限制(尽pipe机器或实例限制仍可能适用)。

在PHP脚本中获取内存泄漏非常容易 – 尤其是在使用抽象(如ORM)的情况下。 尝试使用Xdebug来分析您的脚本,并找出所有内存的位置。

当使用array_push将2250万条logging添加到一个数组中时,在使用4G作为php.ini中的内存限制的20Mlogging中,我不断收到“内存耗尽”致命错误。 为了解决这个问题,我添加了声明

 $old = ini_set('memory_limit', '8192M'); 

在文件的顶部。 现在一切正常。 我不知道如果PHP有内存泄漏,这不是我的工作,也不关心。 我只需要完成我的工作,这工作。

该程序非常简单:

 $fh = fopen($myfile); while (!feof($fh)) { array_push($file, stripslashes(fgets($fh))); } fclose($fh); 

致命的错误指向第3行,直到我提高了内存限制,从而消除了错误。

编辑:更正ini_set的语法。

我一直得到这个错误,即使在php.ini设置memory_limit ,并用phpinfo()正确读出值。

从这改变它:

 memory_limit=4G 

对此:

 memory_limit=4096M 

在PHP 7中修复它。

当你看到上面的错误 – 特别是(tried to allocate __ bytes)是一个低值,这可能是一个无限循环的指标,就像一个调用自己没有出路的函数:

 function exhaustYourBytes() { return exhaustYourBytes(); } 

启用这两行后。
它开始工作

 ; 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 (128MB) ; http://php.net/memory-limit memory_limit = 128M 

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

在Drupal 7中,您可以修改站点/默认文件夹中的settings.php文件中的内存限制。 在260线左右,你会看到:

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

即使您的php.ini设置足够高,如果您的Drupal settings.php文件中没有设置,也将无法使用超过128MB的内容。

您网站的根目录: –

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

对于Drupal的用户,Chris Lane的回答是:

 ini_set('memory_limit', '-1'); 

但是我们需要在开幕之后立即进行

 <?php 

在网站根目录的index.php文件中添加标签。

PHP 5.3+允许您通过将.user.ini文件放在public_html文件夹中来更改内存限制。 只需创build上述文件并在其中键入以下行:

 memory_limit = 64M 

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

对于那些摸不着头脑的人来说,这个小函数应该会导致内存泄漏,有时会出现一些小错误,函数会以recursion的方式自始至终地调用自己。

例如,一个代理类与要代理它的对象的函数具有相同的名称。

 class Proxy { private $actualObject; public function doSomething() { return $this->actualObjec->doSomething(); } } 

有时候你可能会忘记带上这个小实体对象,而且因为代理实际上有这样做的方法,PHP不会给你任何错误,对于一个大的类来说,它可能会隐藏起来几分钟以找出原因它正在泄漏内存。

像这样运行脚本(例如cron): php5 /pathToScript/info.php会产生相同的错误。

正确的方法是: php5 -cli /pathToScript/info.php

CRASH页面? 在这里输入图像描述

(这发生在MySQL必须查询大行时,默认momory_limit设置为小,这对硬件更安全)

您可以在增加php.ini之前检查您的系统现有的内存状态

 # free -m total used free shared buffers cached Mem: 64457 63791 666 0 1118 18273 -/+ buffers/cache: 44398 20058 Swap: 1021 0 1021 

在这里,我已经增加了如下,然后service httpd restart以解决CRASH Page问题。

 # grep memory_limit /etc/php.ini memory_limit = 512M 

如果您运行的是WHM驱动的VPS(虚拟专用服务器),则可能会发现您无权直接编辑PHP.INI; 该系统必须做到这一点。 在WHM主机控制面板中,进入服务configuration> PHPconfiguration编辑器,修改memory_limit:

更新WHM 11.48.4上的memory_limit

我觉得它是有用的,包括或要求:
dbconnection.php ,实际处理的文件中的_functions.php,
而不是包含在标题上。 其中包括自己。

因此,如果您的页眉页脚已包含在内,只需在添加页眉之前包含所有function文件即可。

运行在比之前工作的数据集小的数据集上时,出现以下错误。

 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in C:\\workspace\image_management.php on line 173 

由于对故障的追寻将我带到了这里,所以我想我会提到,并不总是上面的技术解决scheme,而是更简单的事情。 就我而言,这是Firefox。 在我运行程序之前,它已经使用了1157M。
事实certificate,我一段时间以来一直在观看一段50分钟的video,这一切都搞砸了。 专家正确的解决这个问题,甚至没有考虑到这个问题,但是对于我这样的人来说,这是值得的。

清除浏览器caching并尝试。 错误可能是由于浏览器尝试上传大文件或损坏的文件到服务器。

不知道这个答案是否有任何帮助,但是当我从我的代码中删除以下行,所有工作正常!

 set_include_path(get_include_path() . get_include_path().'/phpseclib'); 

include_once( '净/ SSH2.php'); include_once( '净/ SFTP.php');

这些行包含在正在运行的每个文件中,当一个一个地运行文件时,一切正常,但是当运行所有文件时,我得到了内存泄漏问题。 不知怎的,“include_once”不包括一次事件,或者做错了事情。