PDO ping 的实例 ,解决mysql has gone的问题

xiaoxiao2021-02-28  101

项目中遇到了  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; }

转载请注明原文地址: https://www.6miu.com/read-44817.html

最新回复(0)