当我运行此脚本时,apache使用所有可用内存,服务器无响应:
$db = new mysql();
$result = $db->query($sql);
while($row = $db->query($sql)) ...
为什么PHP限制不限制apache进程? PHP正在使用apache itk mod_php
。
我在php.ini
设置了PHP限制,我在phpinfo()
中看到了此限制。我没有在PHP脚本中设置任何限制。
答案 0 :(得分:1)
正如您所知,while($row = $db->query($sql))
导致无限循环;它只是反复运行查询,直到服务器终止或终止进程。您需要while($row = $result->fetch())
或while($row = $result->fetch_assoc(...))
。
另外,请don't use mysql_*
; mysql_*
函数已过时,deprecated且不安全。请改用MySQLi
或PDO
。
修改:我一开始并不理解你的问题。这就是问题:mod_php在Apache中运行,这意味着它通过Apache进程请求内存。因此,$db->query()
所需的内存由Apache使用,而不是单独的mod_php进程。 mysql_ *函数存在一些已知的内存问题。例如,如here所述,mysql_query()
缓冲查询中的所有数据。然而,mod_php显然没有跟踪它,因为你实际上从未将这些数据分配给PHP变量。所以,Apache的内存占用量不断增长,但是mod_php没有意识到这一点,所以php.ini的内存限制从未开始。
正如我上面所说,你应该避免使用mysql_ *函数和MySQL类,并使用MySQLi或PDO。这种有缺陷的行为是一个很好的理由。祝你好运!