133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
1
PostgreSQL

PDOStatement::execute(): MySQL server has gone away

19.04.2017, 20:22. Показов 5541. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выдает такую вот ошибку. Как я успел почитать в сети, это то что соединение закрылось.

А скрипт php еще в работе. Он работает постоянно через конструкцию
while(true) { .... } и раз в 2 минуты делает запросы к бд. Но После 2х минут , после запуска скрипта, Выдает такую ошибку.
Как можно решить?
Пробовал писать реконект. Не помогло.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
namespace database;
 
use \PDO;
 
class Connection {
 
    private static $PDOInstance;
    private static $db_name = '****';
    private static $db_user = '*****';
    private static $db_pass = '*****';
    private static $stmt;
 
    static private $ConInstance;
 
    static public function getInstance() {
      if (!self::$PDOInstance) {
          self::$PDOInstance = new self;
      }
      return self::$PDOInstance;
    }
 
    private  function __construct() {
        try {
            $this::$ConInstance = new \PDO('mysql:host=localhost;dbname='.self::$db_name, self::$db_user, self::$db_pass);
            $this::$ConInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this::$ConInstance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $this::$ConInstance->exec('SET NAMES utf8');
 
        } catch (PDOException $e) {
            die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
        }
    }
 
    private function __clone() {}
 
    private function __wakeup() {}
 
    private function __sleep() {}
 
    public function query($sql,$params = []){
        if(!is_array($params)){ $params = array($params); }
        try{
          self::$stmt = self::$ConInstance->prepare($sql);
          self::$stmt->execute($params);
          return self::$PDOInstance;
        }catch(PDOException $e){
          if($e->getCode() != 'HY000' || !stristr($e->getMessage(), 'server has gone away')) {
              die("PDO SQL ERROR: " . $e->getMessage() . "<br/>");
          }
          return $this->reconnect($sql,$params = []);
        }
    } 
 
    public function reconnect($sql, $params = []){
        self::$stmt = null;
        self::$PDOInstance = null;
        self::getInstance();
        return $this->query($sql, $params);
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2017, 20:22
Ответы с готовыми решениями:

Ошибка DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/...
на старом серваке все работало, переехал на новый и никак не могу понять, что к чему... пишет...

Response.Redirect, Server.Transfer, Server.Execute - в чем отличие?
Народ, если кто знает объясните в чем разница между этими методами: Response.Redirect,...

Объект Server, ASP 0231 (0x80004005) Ошибка Server.Execute
хочу подстраховаться на случай перезагрузки сервера и на sub Application_ onStart повесить...

Server.Execute недовыводит :(
в коде даю Server.Execute(&quot;/map_&quot; &amp; ID &amp;&quot;.asp&quot;) допустим ID = 123 файл map_123.asp содержит в...

4
Эксперт PHP
3834 / 3182 / 1337
Регистрация: 01.08.2012
Сообщений: 10,788
19.04.2017, 21:55 2
После 27-ой строки:
PHP
1
$this::$ConInstance->query("SET wait_timeout=X");
Где X - максимальное время ожидания в секундах. Если написать 600 - будет ждать 10 мин.

Цитата Сообщение от maruo Посмотреть сообщение
PHP
1
$this::$ConInstance->exec('SET NAMES utf8');
Незачем лишний запрос делать, кодировку можно указать в dsn.

PHP
1
new PDO('mysql:host=localhost;dbname=test;charset=utf8', $user, $pass);
1
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
19.04.2017, 22:00  [ТС] 3
Jodah, Я правильно понимаю? 10 минут будет ждать до след запроса? или вообще 10 минут только жить будет?
0
Эксперт PHP
3834 / 3182 / 1337
Регистрация: 01.08.2012
Сообщений: 10,788
19.04.2017, 22:13 4
maruo, из доки mysql:

The number of seconds the server waits for activity on a noninteractive connection before closing it.
Думаю, это значит 10 минут до следующего запроса.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
26.04.2017, 06:09  [ТС] 5
Работает.
Скажите, это может за собой что то повлечь? То что тайм лимит стоит свыше 3х минут?
Тк. такое длинное соединение нужно только для демон сервера.
А для сайта и оно не нужно, а в приложении используется 1 класс для соединения с бд. Имеет ли смысл разделить на несколько классов?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2017, 06:09
Помогаю со студенческими работами здесь

Как запустить Server.Execute?
Есть необходимость в рамках одной асп запустить и выполнить другую с параметрами. код...

Передать АСП код в Server.Execute
Использую Server.Execute. Как передать обьект 'adodb.recordset' в следующую ASP-шку.

Server.Execute не позволяет выполнить OnClick
Никто не пишет сайты монолитно из одного файла, но у меня возникала проблема с функцией Execute. ...

Установлен Windows NT. Не работает Server.Execute. Помогите
Машина работает на системе Windows NT4. Установлен IIS 4. ASP ругается на...

Помогите разобратся как работает <%Server.Execute();%>
Я вставляю в index.aspx файл def.aspx cледующим образом: &lt;%Server.Execute('def.aspx');%&gt; В файле...

Умеет ли Server.Execute() понимать Perl скрипты?
Собственно вопрос задан :) Можно ли сервер научить обрабатывать выражения вида:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru