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


当前回答

改变;memory_limit = 512 ; memory_limit = 1 在

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

其他回答

PHP的内存分配可以永久调整,也可以临时调整。

永久

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

如果您可以访问php.ini文件,您可以将memory_limit的值编辑为您想要的值。

如果你不能访问你的php.ini文件(你的主机允许),你可以通过你的.htaccess文件覆盖内存分配。添加php_value memory_limit 128M(或您想要的分配值)。

临时

您可以在PHP文件中动态地调整内存分配。你只需有代码ini_set('memory_limit', '128M');(或者你想要的分配)。您可以通过将值设置为“-1”来删除内存限制(尽管机器或实例限制仍然可能应用)。

当用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行,直到我提高了内存限制 消除了错误。

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

把它改成这样:

memory_limit=4G

:

memory_limit=4096M

这纠正了PHP 7中的问题。

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

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

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

这个问题是几年前问的,所以尽管我的事实不一样,但我最近在循环中解析服务器上的html表时也收到了这个错误。出现错误的原因是html使用双引号解析,而双引号连接到变量$table,同时在多行上连接字符串。

$table = "<table>\n";
    $table .= "<tbody>\n";
        foreach ($data as $item) {
            $table .= "<tr>\n";
                // this caused the Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted
                $table .= "<td>$item->description</td><td>$item->qty</td>" .  
                $table .= "<td>$item->price_incl</td><td>$item->price->vat</td>" .
                $table .= "<td>$item->price_excl</td><td>$item->available</td>" .
            $table .= "</tr>\n";
        }
    $table .= "</tbody>";
$table .= "</table>\n";

上面的错误对我来说很奇怪,但考虑到我已经将字符串连接到$table变量,现在我尝试这样做似乎很愚蠢。解决方案是删除第7行和第8行的变量连接,或者删除第6行、第7行和第8行的端点连接符号。