【问题标题】:mysql query loop in phpphp中的mysql查询循环
【发布时间】:2014-02-03 00:57:14
【问题描述】:

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

【问题讨论】:

  • 我认为他理解自己犯的错误(他在第一行将其描述为意外)。他的问题是为什么服务器从不终止脚本,因为它处于循环中。也许这个问题最好在服务器管理站点中提出,例如serverfault.com。
  • 嗯... OP 已经可以访问查询的资源,所以应该迭代。看来有人不够努力

标签: php mysql apache


【解决方案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。这种错误的行为是一个很好的理由。祝你好运!

【讨论】:

  • 也许我的英语不好,但我会重复一遍。我知道为什么代码不起作用,我知道如何解决它。我问关于 php 的限制。为什么 php 限制在这种情况下不起作用。
  • 一开始我误解了你的问题;我已经编辑了我的答案以解决 PHP 忽略内存限制的原因。
  • 所以问题是“没有将结果分配给变量”?是php错误吗?看起来是这样。因此,在这种情况下,用户能够避免 php 限制并关闭服务器。
  • 更少的 PHP 错误,更多的是 mod_php 错误/旧的 MySQL 库错误。除非您的代码中有错误,否则用户无法避免 PHP 限制;如果您的代码没有进入无限循环,它将使用更少的内存并且不会失控。当然,恶意用户可以总是通过 DDoS 攻击(从大量地址向服务器发送过多流量)压倒服务器,但这与 PHP 无关;这是真的,无论您使用什么技术。
  • 不要比较 DDoS 攻击和简单循环 :) 我已经将 PHP 和 MySQL 更新到最新版本,使用了 mysqli lib 并得到了相同的结果。内存限制在这种情况下不起作用。
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2014-02-05
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2016-03-31
相关资源
最近更新 更多