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


当前回答

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

记忆错误神奇地消失了!

其他回答

在我的情况下,mac (Catalina - Xampp)没有加载文件,所以我必须先这样做。

sudo cp /etc/php.ini.default /etc/php.ini
sudo nano /etc/php.ini

然后修改memory_limit = 512M

然后重新启动Apache,检查文件是否加载

php -i | grep php.ini

结果是

Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

最后检查

php -r "echo ini_get('memory_limit').PHP_EOL;"

报错(' memory_limit ', ' 1 ');覆盖默认的PHP内存限制。

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

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

修改php.ini文件中的内存限制并重新启动Apache。重启后,运行phpinfo();函数从任何PHP文件中获取memory_limit更改确认。

memory_limit = -1

内存限制-1表示没有设置内存限制。现在是最大值。

greeting是一个非常常见的问题,因为如果你分配给php的内存非常少,而你的网站正在增长,将需要更多的资源。

我发现自己在一个网站,有问题,给错误500修改只有一些产品,问题是他们在这些特定的产品中使用了非常重的图像,解决方案: 1.-增加php.ini中的“memory_limit 2.—降低图片的权重。 3.-再次调整“memory_limit”为一个可接受的值“512M”,至少对我来说绰绰有余。

现在,重要的是要验证所做的更改,因为PHP除了在服务器上有几个版本和几种类型的安装外,可能您修改了一个而它不起作用,这是因为您没有修改正确的PHP .ini文件。

如何验证修改的文件是否正确?

在prestashop仪表板进入高级设置/信息,你可以看到“内存限制”。

始终记住,在php.ini文件中进行更改后,建议重新启动apache或Nginx。

Ubuntu: sudo服务apache2重启

重要提示:永远不要设置“memory_limit = -1”,正如许多人在这里提到的那样。问题在于,如果某个文件或模块出现问题,就可能处于持续循环中,消耗服务器的所有内存和处理器。让我们举一个简单的例子:一个模块有一个错误,并调用了一个函数,直到它不是正的,它会继续调用,这将创建一个无限循环,它永远不会停止这样做,因为php没有限制。

我希望它能帮助有这个问题的同事。