php中的mysql查询循环

时间:2014-02-03 00:57:15

标签: php mysql apache

当我运行此脚本时,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脚本中设置任何限制。

1 个答案:

答案 0 :(得分:1)

正如您所知,while($row = $db->query($sql))导致无限循环;它只是反复运行查询,直到服务器终止或终止进程。您需要while($row = $result->fetch())while($row = $result->fetch_assoc(...))

另外,请don't use mysql_*; mysql_*函数已过时,deprecated且不安全。请改用MySQLiPDO

修改:我一开始并不理解你的问题。这就是问题: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。这种有缺陷的行为是一个很好的理由。祝你好运!