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


当前回答

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

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

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

其他回答

当用array_push向数组中添加2250万条记录时,我一直在php.ini文件中使用4G作为内存限制,在大约20M条记录时得到“内存耗尽”致命错误。为了解决这个问题,我添加了这个语句

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

在文件的顶部。现在一切正常。我不知道PHP是否有内存泄漏。那不是我的工作,我也不在乎。我只需要完成我的工作,这个成功了。

程序非常简单:

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

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

对于那些正在挠头寻找为什么这个小函数会导致内存泄漏的人来说,有时由于一个小错误,一个函数开始递归地永远调用自己。

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

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}

有时你可能会忘记带那个小的actualobjecc成员,因为代理实际上有那个doSomething方法,PHP不会给你任何错误,对于一个大的类,它可能会被隐藏几分钟,以找出它泄漏内存的原因。

PHP 5.3+允许您通过在public_html文件夹中放置.user.ini文件来更改内存限制。 简单地创建上面的文件,并在其中键入以下一行:

memory_limit = 64M

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

我花了两天时间寻找解决这个问题的方法,我在打电话给PDO时发现了这是原因

$stmt->bindParam(":PERIOD", $period); 

变量周期是an

empty string ''

所以这个问题可能有多个根本原因,我给你们的建议是尝试一种试错法或者二分法来寻找根本原因,删除代码并尝试搜索失败的行代码

更新:我也面临这个错误的方法$pdo->查询(),我使用$pdo->准备(),工作得很好,所以,当我有

$sql = "SELECT * FROM COURSE_DETAILS where ACTIVE = 1 AND COURSE_DETAILS_ID = $id";
$stmt = getConnection()->query($sql);
$courseDetails = $stmt->fetchAll(PDO::FETCH_ASSOC)

然后我把这个改成

$sql = "SELECT * FROM COURSE_DETAILS where ACTIVE = 1 AND COURSE_DETAILS_ID = ?";
$stmt = getConnection()->prepare($sql);
$stmt->execute(array($id)); 

记忆错误神奇地消失了!

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