@IgorNoskov

Как бороться с ошибкой MySQL server has gone away?

Привет, друзья!
Запускаю на сервере скрипт, который по очереди обращается к серверам из списка. Процесс занимает около 5 минут. Если очередной сервер отправляет статус "подождать" усыпляют скрипт на 60 секунд с помощью функции sleep(60). Почти в конце работы происходит ошибка atal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away.

Подключение к базе происходит следующим образом:
файл Core/Model.php
<?php

namespace Core;

use PDO;

/**
 * Base model
 */
abstract class Model {

  /**
   * Gets the PDO database connection
   *
   * @return PDO
   */
  protected static function getDB() {
    static $db = null;

    if ( $db === null ) {
      $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
      $db  = new PDO( $dsn, DB_USER, DB_PASS );

      // Throw an Exception when an error occurs
      $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }

    return $db;
  }
}

Сама модель:
<?php

namespace App\Models;

use PDO;

class MFO extends \Core\Model {

  /**
   * Creates response
   *
   * @param int $mfo_id
   * @param int $request_id
   * @param string $status
   *
   * @return bool
   */
  public static function createResponse( int $mfo_id, int $request_id, string $status ) {
    $sql = 'INSERT INTO mfo_responses (mfo_id, request_id, status, time_response) VALUES (:mfo_id, :request_id, :status, :time_response)';

    $db   = static::getDB();
    $stmt = $db->prepare( $sql );

    $stmt->bindValue( ':mfo_id', $mfo_id, PDO::PARAM_INT );
    $stmt->bindValue( ':request_id', $request_id, PDO::PARAM_INT );
    $stmt->bindValue( ':status', $status, PDO::PARAM_STR );
    $stmt->bindValue( ':time_response', date( 'Y-m-d H:i:s', time() ), PDO::PARAM_STR );

    return $stmt->execute();
  }
}


Подскажите, пожалуйста, что можно сделать?
  • Вопрос задан
  • 3936 просмотров
Решения вопроса 1
kotomyava
@kotomyava
Системный администратор
Может не укладываетесь в wait_timeout?
Посмотрите, сколько он у вас, и сравните со временем выполнения скрипта.

Такая ошибка происходит при попытке записи данных в уже закрытое со стороны сервера соединение, или при падении процесса MySQL. Выше описан один из наиболее вероятных вариантов, но если не оно, то надо дальше смотреть лог MySQL, в первую очередь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы