我有一个奇怪的问题。我正在对PHP中的一个非常大的表运行MySQL查询。查询时间超过一分钟,但这不是我的问题。看起来PHP每66秒重新发送一次查询。
show processlist;
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| 150018 | root | localhost | amrs | Query | 32 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
几分钟后,我又检查了一下:
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| 150018 | root | localhost | amrs | Query | 188 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
| 150021 | root | localhost | amrs | Query | 122 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
| 150023 | root | localhost | amrs | Query | 56 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
我没有重新加载页面或任何东西。在脚本开头附近调用set_time_limit(0)。令人讨厌的部分是,页面似乎与最近运行的页面相关联。因此,如果我杀死150018,没有什么不好的事情发生,但如果我在生成另一个之前杀死150023,则该页面会出现“查询执行中断”错误。 150018最终将自行运行,但它没有任何好处,因为脚本/页面不会收到它。
有人有什么想法吗?
编辑:显示完整的进程列表给出以下内容(为了简洁和机密,删除了一些行):
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
| 147385 | root | localhost:44560 | amrs | Sleep | 14021 | | NULL
| 150248 | root | localhost | NULL | Query | 0 | NULL | show full processlist
| 150251 | root | localhost | amrs | Query | 1 | statistics | /*DEREK*/select ctlno, count(*) AS count from (snip)
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
答案 0 :(得分:1)
我之前已经看过几次类似的问题了,你的问题听起来与我以前在网站上工作时的问题非常相似。
您在访问网站时是否要通过代理服务器?
我的网站发生的事情是,来自同一公司内某个特定用户的查询是通过他们的代理服务器进行定向的,该代理服务器自己决定如果在60秒内没有收到响应,那么它会只是再次发出Web请求,而不通知客户端浏览器发生了这种情况!
因此,对于某些长时间运行的查询需要花费一分钟来执行,我会看到查询开始相互复合,我最终会查看一个包含大量相同查询的进程列表,每个查询都在运行几乎正好相隔60秒!
对此的解决方法是让客户绕过我们网站的代理服务器。
当客户端将其代理服务器升级到最新版本时,解决了此完全相同问题的第二个实例。
对不起,但我记不起在任何一种情况下使用的是什么代理服务器,就像几个月前一样,我从此睡过了: - /