sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

Resolver el servidor MySQL ha desaparecido errores

Es posible que desee manejar este problema haciendo "ping" en el servidor mysql antes de una consulta. Esta es una mala idea. Para obtener más información sobre por qué, consulte esta publicación SO:¿Debo hacer ping al servidor mysql antes de cada consulta?

La mejor manera de manejar el problema es envolver consultas dentro de try/catch bloquea y detecta las excepciones de la base de datos para que pueda manejarlas adecuadamente. Esto es especialmente importante en secuencias de comandos de ejecución prolongada y/o de tipo daemon. Entonces, aquí hay un ejemplo muy básico que usa un "administrador de conexiones" para controlar el acceso a las conexiones de la base de datos:

class DbPool {

    private $connections = array();

    function addConnection($id, $dsn) {
        $this->connections[$id] = array(
            'dsn' => $dsn,
            'conn' => null
        );
    }

    function getConnection($id) {
        if (!isset($this->connections[$id])) {
            throw new Exception('Invalid DB connection requested');
        } elseif (isset($this->connections[$id]['conn'])) {
            return $this->connections[$id]['conn'];
        } else {
            try {
                // for mysql you need to supply user/pass as well
                $conn = new PDO($dsn);

                // Tell PDO to throw an exception on error
                // (like "MySQL server has gone away")
                $conn->setAttribute(
                    PDO::ATTR_ERRMODE,
                    PDO::ERRMODE_EXCEPTION
                );
                $this->connections[$id]['conn'] = $conn;

                return $conn;
            } catch (PDOException $e) {
                return false;
            }
        }
    }

    function close($id) {
        if (!isset($this->connections[$id])) {
            throw new Exception('Invalid DB connection requested');
        }
        $this->connections[$id]['conn'] = null;
    }


}


class Crawler {

    private $dbPool;

    function __construct(DbPool $dbPool) {
        $this->dbPool = $dbPool;
    }

    function crawl() {
        // craw and store data in $crawledData variable
        $this->save($crawledData);
    }

    function saveData($crawledData) {
        if (!$conn = $this->dbPool->getConnection('write_conn') {
            // doh! couldn't retrieve DB connection ... handle it
        } else {
            try {
                // perform query on the $conn database connection
            } catch (Exception $e) {
                $msg = $e->getMessage();
                if (strstr($msg, 'MySQL server has gone away') {
                    $this->dbPool->close('write_conn');
                    $this->saveData($val);
                } else {
                    // some other error occurred
                }
            }
        }
    }
}