跑数据流程这几天总是出错,暂时还没有精力重构,先处理一些紧急的问题吧。鉴于目前问题都出在MySQL执行查询出错的情况,决定对mysql_query进行封装。封装函数如下。
目前只处理2006错误,对于1317错误,只有重试的方法,以后再补充。
对于2006错误,需要重连MySQL,但是有一点需要注意的是,在重连之前一定要先关闭之前的连接,否则永远报2006错误
之前没写过异常处理,try{}catch(){},嘿嘿,用了一下就会了。
/** * @param $sql 需要执行的SQL语句 * @param $link 数据库连接 * @param $conn 使用线上还是线下数据库,默认为线下 online:线上 offline:线下 */ function dh_mysql_query($sql, &$link=null, $db) { $i = 0; do{ try{ $ret = mysql_query($sql); if(!$ret){ //抛出MySQL错误号 $ec = mysql_errno(); throw new Exception($ec); } }catch(Exception $e){ //处理mysql错误号 switch($e->getMessage()){ case '2006':// MySQL Server has gone away mysql_close($link); if($db == "online"){ $link = connect_online(); }else { $link = conn_db(); } break; case '1317'://Query execution was interrupted sleep(3); break; } } $i ++; }while(!$ret && $i<5); if(!$ret){ $ec = mysql_errno(); $err = mysql_error(); $desc = json_encode(array('event'=>'mysql query error','sql'=>$sql,'errno'=>$ec,'errmsg'=>$err,'debug_info'=>debug_backtrace(true))); write_log($desc); //curl_send_msg('13691102775',$desc); //exit($desc); } return $ret; }
以后再补充针对MySQL其他错误的处理方式