我有一个奇怪的问题.我正在对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)
Run Code Online (Sandbox Code Playgroud)
几分钟后,我再次检查:
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| 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)
Run Code Online (Sandbox Code Playgroud)
我没有重新加载页面或任何东西.在脚本开头附近调用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)
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我以前见过几次类似的问题,您的问题听起来与我在以前的网站上遇到的问题非常相似。
您访问该网站时是否通过代理服务器?
我的网站发生的情况是,来自同一家公司内的一组特定用户的查询通过他们的代理服务器进行定向,代理服务器自行决定,如果在 60 秒内没有收到响应,那么它只会发出再次进行网络请求,而不通知客户端浏览器发生了这种情况!
因此,由于某些长时间运行的查询需要一分钟多的时间来执行,我会看到查询开始相互复合,并且我最终会看到一个进程列表,其中运行着相同的查询负载,每个查询之间几乎用正好60秒!
解决方案是让客户端绕过我们网站的代理服务器。
当客户端将代理服务器升级到最新版本时,这个完全相同的问题的第二个实例得到了解决。
抱歉,但我不记得在这两种情况下使用了什么代理服务器,因为那是几个月前的事,从那时起我就睡着了:-/
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |