项目中遇到了 mysql has gone的情况 , 因为这个脚本是一直开启的状态,不会自己断掉, so 需要在每次查询前 检测链接是不是正常的操作;
公司的Api 这部分是没有封装成类的 图省事 也没有封住成类 (下面会讲到类的怎么操作)
PDO 生成的时候最好还是加上两个选项
$option = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 有错误的时候 抛出错误 PDO::ATTR_PERSISTENT => true // 长链接 ];
<?php /** * gen PDO instance * @return PDO */ function getPdo() { static $pdo; try { if (!$pdo) { $pdo = pdoInit(); } // check pdo link $pdo = pingPdo($pdo); if (!is_object($pdo)) { throw new \PDOException('reconnect mysql failed'); } } catch (\PDOException $e) { error_log($e->getMessage(), 3, ERROR_LOG); trigger_error($e->getMessage(), E_USER_ERROR); } return $pdo; } // ping pdo function pingPdo($pdo) { try { if (!is_object($pdo) || !method_exists($pdo, 'query')) { throw new \PDOException('mysql has gone'); } // just do it $pdo->query('do 1'); } catch (\PDOException $e) { // init pdo $pdo = pdoInit(); } return $pdo; } // init pdo function pdoInit() { $config = get_config('db'); $pdo = null; $i = 0; while ($i < 3 && !$pdo) { try { $pdo = new PDO($config['dsn'], $config['usr'], $config['pwd']); } catch (\PDOException $e) { $i++; } } return $pdo; }