2012-08-27 84 views
4

我一直在挠我的脑袋,试图找出是什么导致我的脚本中的间歇性错误。错误是:SQLSTATE [HY000]:一般错误:2006 MySQL服务器已经消失。间歇性的MySQL服务器已经消失了错误

下面的脚本是一个函数的一部分,该函数执行curl,从JSON响应中获取一些值,然后将它们写入表中。我会说80%的时间工作正常,然后另外20%我得到服务器消失的错误。我一直无法确定导致错误的任何趋势,这似乎是随机的。任何想法,为什么我可能会得到这个错误?感谢您检查了这一点

... 
    //post via cURL 
    $ch = curl_init($url); 
    $timeout = 500; 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $this->response = curl_exec($ch); 
    $this->json_decoded = json_decode($this->response); 
    $this->full = print_r($this->json_decoded, true); 
    $client_leadid = $this->json_decoded->Parameters->lead_id; 
    $client_status = $this->json_decoded->Status; 
    $length = curl_getinfo($ch); 
    curl_close($ch); 

    //record in DB 
    $insert = $this->full.' | '.$url.' | '.$myvars.' | '.$this->date . ' | Time Taken: '.$length['total_time']; 
    $db->exec("UPDATE table SET client_resp = '$insert' WHERE global_id = '$this->leadid' LIMIT 1"); 
    $db->exec("UPDATE table SET client_leadid = '$client_leadid' WHERE global_id = '$this->leadid' LIMIT 1"); 
+0

你可以在MySQL错误日志读什么? – Jocelyn

+4

你可能会想找到找到的原因清单[这里](http://dev.mysql.com/doc/refman/5.0/en/gone-away.html)。 – Josh

+1

您可以将查询数减少50%,这可能会对您所面对的renadom角色产生积极影响。快乐的调试,因为你迄今共享的内容不是问题,而是猜测的邀请。当工作/停止工作时,网络连接会发生什么情况。你有没有监视这些?怎么样的错误日志?服务器负载如何?实际上,请以纯文本形式提供查询,而不是PHP代码。 – hakre

回答

4

这可能发生,因为你的卷曲的请求所花费的时间,则MySQL连接超时

要么 1)设定的请求超时CURL所以它死越早上的错误( CURLOPT_CONNECTTIMEOUT仅用于连接 - CURLOPT_TIMEOUT用于请求的总长度,并且如果服务器没有及时响应,它将停止) 2)调高mysql空闲超时以防止服务器因为不发送查询而断开连接
3)检测错误并自动重新连接到mysql

mysql> show variables like "%timeout%"; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| connect_timeout   | 5  | 
| delayed_insert_timeout | 300 | 
| innodb_lock_wait_timeout | 50 | 
| interactive_timeout  | 28800 | 
| net_read_timeout   | 30 | 
| net_write_timeout  | 60 | 
| slave_net_timeout  | 3600 | 
| table_lock_wait_timeout | 50 | 
| wait_timeout    | 28800 | 
+--------------------------+-------+ 
9 rows in set (0.00 sec) 

WAIT_TIMEOUT和interactive_timeout在两个你关心

+0

谢谢,我已经增加了MySQL超时和上午等着看是否解决了这个问题。我没有意识到这些设置,所以谢谢你的提示! –

+0

你建议'检测到错误并自动重新连接'你能提供一些关于如何做到这一点的指导吗?我会用try {...} catch(PDOException $ err){[reconnect_here]}来做它吗?我会用什么来代替[reconnect_here]?感谢您的帮助... –

+0

Rob-它取决于您的代码.. 如果你有你自己的数据库类与它的查询()函数 - 你会陷阱错误,重新连接,然后再次调用query()要重试的完全相同的参数(直接返回结果 - 考虑递归) 如果您直接在您的代码中编写数据库查询,您只需要以艰难的方式完成(重新连接+重新运行查询尝试阻止...但是如果服务器仍然处于第二次尝试状态,请确保你发现了错误) - 不是我会推荐嵌套尝试{} catch {}块,如果你可以帮助它 – RobertMaysJr