我有一堆客户端销售点(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的最大脚本执行时间,但它仍然出错。
这个问题是几年前问的,所以尽管我的事实不一样,但我最近在循环中解析服务器上的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行的端点连接符号。
我花了两天时间寻找解决这个问题的方法,我在打电话给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));
记忆错误神奇地消失了!