2016-12-14 4 views
1

Im в настоящее время работает специальный скрипт PHP, который при запуске на моем локальном хосте работает нормально, однако при работе на виртуальном хостинге, я получаю следующее сообщение об ошибке:PHP Mysql PDO: Общая ошибка: 2006 Сервер MySQL ушел

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006

MySQL server has gone away' in ...... 205 Stack trace:

0 ........ PDO->prepare('SELECT * FROM o...') #1 {main} thrown in .......... on line 205

(я заменил пути к файлам с .......)

вещей я пытался:

  1. Добавление PDO::ATTR_TIMEOUT => "999999999999999999999", чтобы продлить любой таймаут.

  2. Проверил max_allowed_packet (каждый ответ ив нашел говорит, что это является причиной) Моя местная машина в настоящее время устанавливается в 1048576 (1Mb), однако мой хостинг в настоящее время установлен в 268435456 (268 МБ)

I будет понятно, если моя локальная машина была 268 МБ, а мой хостинг - 1 Мб, но это не имеет никакого смысла, что это является причиной проблемы, поскольку это не так.

Я попытался увеличить его на своем хостинге, но по мере его совместного использования у меня нет прав на изменение этой глобальной переменной.

Любые другие идеи, что я мог попробовать?

FYI Вот сценарий:

//MYSQL PREPARE STATEMENTS 
//check to see if a product is in database 
$mysql['productcheck'] = $mysql['pdo']->prepare('SELECT * FROM oc_product WHERE sku = ?'); 
$newproductcount=0; 
$x = 0; 
while(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new") || ($maintable[$x]['status']=="discontinued") || ($maintable[$x]['status']=="archive")) { 
    if(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new")){ 
     //check to see if product exsists 
     $params[1]=$maintable[$x]['euid']; 
     $mysql['productcheck']->execute([$params[1]]); 
     if($mysql['productcheck']->rowCount()==0){ 
      //PRODUCT DOESN'T EXSIST 
      echo "Product doesnt exsists!"; 
      $newproductcount++; 
     } 
    } 
$x++; 
} 

ответ

1

Некоторые другие распространенные причины для сервера MySQL ушел ошибка являются:

  • Вы (или администратор БД) убил текущую нить с инструкцией KILL или командой kill mysqladmin.

  • Вы попытались выполнить запрос после закрытия соединения с сервером. Это указывает на логическую ошибку в приложении, которая должна быть исправлена.

  • Клиентское приложение, работающее на другом хосте, не имеет необходимых полномочий для подключения к серверу MySQL с этого хоста.

  • У вас есть тайм-аут соединения TCP/IP на стороне клиента. Это может произойти, если вы используете команды: mysql_options (..., MYSQL_OPT_READ_TIMEOUT, ...) или mysql_options (..., MYSQL_OPT_WRITE_TIMEOUT, ...). В этом случае увеличение таймаута может помочь решить проблему.

  • Вы столкнулись с таймаутом на стороне сервера, и автоматическое повторное соединение на клиенте отключено (флаг повторного подключения в структуре MYSQL равен 0).

  • Вы используете клиент Windows, и сервер удалил соединение (возможно, потому, что wait_timeout expired) до того, как была выпущена команда.

  • Проблема в Windows заключается в том, что в некоторых случаях MySQL не получает ошибку от ОС при записи на TCP/IP-соединение с сервером, но вместо этого получает ошибку при попытке прочитать ответ из соединения.

  • Решение для этого - либо выполнить mysql_ping() в соединении, если прошло много времени с момента последнего запроса (это то, что делает Connector/ODBC), либо установить wait_timeout на сервере mysqld настолько высоко, что это на практике никогда не истекает.

  • Вы также можете получить эти ошибки, если вы отправляете запрос на сервер, который является неправильным или слишком большим. Если mysqld получает слишком большой или неправильный пакет, он предполагает, что что-то пошло не так с клиентом и закрывает соединение. Если вам нужны большие запросы (например, если вы работаете с большими столбцами BLOB), вы можете увеличить лимит запроса, установив переменную max_allowed_packet сервера, которая имеет значение по умолчанию 4 МБ. Вам также может потребоваться увеличить максимальный размер пакета на стороне клиента. Более подробная информация об установке размера пакета приведена в разделе B.5.2.10 «Слишком большой пакет».

  • Оператор INSERT или REPLACE, который вставляет большое количество строк, также может вызывать подобные ошибки. Любой из этих операторов отправляет на сервер один запрос независимо от количества строк, которые нужно вставить; таким образом, вы часто можете избежать ошибки, уменьшив количество строк, отправленных на INSERT или REPLACE.

  • Вы также получаете потерянное соединение, если вы отправляете пакет размером 16 МБ или больше, если ваш клиент старше 4.0.8, а ваш сервер 4.0.8 и выше, или наоборот.

  • Также можно увидеть эту ошибку, если ошибки имени хоста не удались (например, если DNS-сервер, на котором работает ваш сервер или сеть, падает). Это связано с тем, что MySQL зависит от хост-системы для разрешения имен, но не имеет способа узнать, работает ли она - с точки зрения MySQL проблема неразличима от любого другого сетевого тайм-аута.

  • Вы также можете увидеть, что сервер MySQL ушел с ошибкой, если MySQL запущен с параметром --skip-networking.

  • Другая проблема с сетью, которая может вызвать эту ошибку, возникает, если порт MySQL (по умолчанию 3306) заблокирован вашим брандмауэром, что предотвращает любые подключения на сервере MySQL.

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

  • Вы столкнулись с ошибкой, когда сервер умер во время выполнения запроса.

Проверить эту ссылку: Gone Away

+0

Такая же проблема - В моем случае проблема была я попытался выполнить запрос после закрытия соединения с сервером - т.е. 'wait_timeout' или, возможно,' connect_timeout' было запущено (30 секунд по умолчанию). В приложении была явная логическая ошибка. – bodi0

Смежные вопросы