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


当前回答

出现此错误的原因是您的服务器配置的内存限制非常低。尝试将此添加到wp-config.php(将其放在<?PHP在这个文件中):

define('WP_MEMORY_LIMIT', '96M');

请注意,这个限制对于主题和随主题而来的插件是OK的。如果你想启用其他插件,你可能需要进一步增加限制。

define('WP_MEMORY_LIMIT', '256M');

其他回答

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

正确的方法是编辑你的php.ini文件。 将memory_limit编辑为所需的值。

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

如果您知道为什么需要这么多,并且您希望允许它设置memory_limit = 512M或更高,那么您应该没问题。

我花了两天时间寻找解决这个问题的方法,我在打电话给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)); 

记忆错误神奇地消失了!

我发现当在实际处理的文件中包含或要求_dbconnection.php_和_functions.php时,而不是在头文件中包含时,它很有用。这是包含在自身中的。

因此,如果包含了页眉和页脚,只需在包含页眉之前包含所有函数文件。

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

永久

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

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

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

临时

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