【问题标题】:PHP and MySQL - Lot of queries causing timeout of 300 secondsPHP 和 MySQL - 大量查询导致 300 秒超时
【发布时间】:2013-03-06 15:13:53
【问题描述】:

我有一个导致 MySQL 性能问题的 PHP 应用程序。发生的情况是:数据库条目扩展一定数量后;它开始随机超时 PHP 页面 300 秒。

我知道我必须重写我的代码,因为它很乱、过时了,而且我基本上在运行很多查询,这可能会更有效率。

但是,我很好奇是什么导致了这种情况,以及是否有短期解决方案。 php 应用程序运行良好,但是在浏览了一些页面后,查询的结果表现得像应该的那样,有时加载时间会变为 300 秒。之后,带有数据库结果的页面完美显示。之后,我可以再次查看一些页面,之后该过程随机重新开始。在页面加载的 300 秒内,SQL 进程列表显示了完整加载时间的命令“Sleep”,没有附加任何查询。

【问题讨论】:

  • 你的意思是这个问题有时会出现,有时不会?
  • @Voitcus,正确,问题每两次页面加载都会发生。这背后没有逻辑,有时会在 1 个页面加载后发生,有时会在 10 个页面加载后发生,等等。
  • 默认情况下,PHP.ini 设置指定如果页面尚未完成服务器处理,则会发生超时。您可以使用以下方法更改此值:php.net/manual/fr/function.set-time-limit.php
  • 也许程序为每个查询打开一个新的数据库连接并且没有关闭它所以 MySQL 停止了?
  • 您的MySQL db 是否记录了任何奇怪的东西,和/或它的慢查询日志说了什么?

标签: php mysql


【解决方案1】:

假设问题确实与 MySQL 有关,您可以尝试为 MySQL 服务器分配更多内存,看看性能是否有所提高。在此处查看“巨大”的 my.cnf 配置:

http://fts.ifac.cnr.it/cgi-bin/dwww/usr/share/doc/mysql-server-5.0/examples/my-huge.cnf.gz

另外,如果您不需要 InnoDB 功能但您的数据库是 InnoDB,您可以切换到 MyISAM 并获得一些性能。

您还应该检查会话锁定和冲突,这有时会导致超时。您应该在读取/写入数据后立即释放会话,因为会话文件会保持锁定状态,直到您关闭会话或脚本结束。

【讨论】:

  • 这可能是一个不错的选择。应用程序在浏览器会话期间超时,并且在此期间无法从该会话访问,但关闭并重新打开浏览器(或在另一个浏览器中访问应用程序)可以解决问题,直到再次发生超时。
  • 准确!非常感谢 =) 调用 session_write_close(); 后问题解决了在我在脚本开始时检查完用户会话之后。
【解决方案2】:

如果进程列表没有显示正在运行的查询,那么问题可能出在您的应用程序上,而不是在 MySQL 上。看看这个:How can I find out which PHP script a process is running in Linux?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2011-12-02
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多