如何在等待长时间运行的MySQL查询时优雅地使PHP脚本超时?

Mar*_*k B 10 php mysql timeout drupal

我有一个运行了大量数据库查询的PHP站点.使用某些参数组合,这些查询可能会长时间运行,从而触发丑陋的超时消息.我想用一个很好的超时消息替换它,根据我的网站风格的其余部分主题.

预见到这类问题的常见答案:

  1. "优化您的查询,以便它们不会运行这么长时间" - 我正在记录长时间运行的查询并对其进行优化,但我只是在用户受到影响后才知道这些查询.

  2. "增加PHP超时设置(例如set_time_limit,max_execution_time),以便长时间运行的查询可以完成" - 有时查询可以运行几分钟.我想告诉用户之前有问题(例如30秒后).

  3. "使用register_tick_function来监视脚本运行的时间" - 这只在我的脚本中的代码行之间执行.当脚本等待数据库的响应时,不会调用tick函数.

如果它有帮助,该站点使用Drupal(具有大量自定义)构建,并且在PHP 5.2上使用MySQL 5在虚拟专用Linux服务器上运行.

Mat*_*hew 0

连接处理文档正是您所需要的。

基本上,您需要使用register_shutdown_function()注册关闭函数。每当脚本完成时都会调用此函数,无论它是否已成功完成、被用户取消(ESC 键)或已超时。

然后该关闭函数可以调用connection_status()函数。如果connection_status()返回2(超时)并且上一页是运行麻烦查询的页面,您可以将用户重定向到一个页面,显示“抱歉,我们现在服务器负载很高”。管他呢。