我有一个运行相当多的数据库查询的PHP网站。通过某些参数组合,这些查询最终可能会运行很长时间,从而触发一个丑陋的超时消息。我想根据我的站点样式的其余部分用主题很好的超时消息替换它。如何让PHP脚本在等待长时间运行的MySQL查询时正常超时?
预见通常回答这样一个问题:
“优化你的查询,使他们不这么长时间运行” - 我记录长时间运行的查询和优化他们,但只有我在用户受到影响后了解这些信息。
“增加您的PHP超时设置(例如,set_time_limit,max_execution_time),以便长时间运行的查询可以完成” - 有时查询可以运行几分钟。我想告诉用户在这之前有问题(例如30秒后)。
“使用register_tick_function监视脚本运行了多长时间” - 这仅在脚本中的代码行之间执行。当脚本正在等待数据库的响应时,tick函数不会被调用。
万一有帮助,该网站是使用Drupal的(有很多定制的)所建,是一个虚拟专用Linux服务器上使用MySQL 5上运行PHP 5.2
这只涉及到运行php代码的地方(通常是一个web服务器)和浏览器之间的连接 - 而不是web服务器和DBMS – symcbean 2010-05-14 12:00:41
他没有要求与DBMS通信的东西,只是一种处理脚本超时的机制优雅地说,这就是connection_status()的设计目的。我编辑了我的答案以提供更多信息。 – Mathew 2010-05-14 16:16:19
这听起来像我需要的解决方案,但我正在努力与重定向。我正在尝试使用PHP header()函数,但它表示标题已经发送。即使有一个简单的测试用例: 'set_time_limit(1); register_shutdown_function( 'clean_shutdown');' 而(真){ } 功能clean_shutdown(){ 如果(CONNECTION_STATUS()&CONNECTION_TIMEOUT){ ob_end_clean(); header('Location:http://www.bbc.co.uk',TRUE,500); } } 我仍然收到一个“头文件已经发送(在第5行)”的消息,但是我看不到它们会被发送到哪里。 – 2010-05-17 09:43:33