致命错误:允许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:
我觉得它是有用的,包括或要求:
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”不包括一次事件,或者做错了事情。