Ошибка при отправке пакета STMT_PREPARE с mysqli Prepare

1

Я работаю cron, чтобы отослать электронные письма. После того, как электронные письма отправлены, я обновляю базу данных, чтобы отметить их отправленные:

$stmt = $this->mysqli->prepare($q))

Но я получаю сообщение об ошибке: Error while sending STMT_PREPARE packet. PID=25982; Error while sending STMT_PREPARE packet. PID=25982;

Ошибка показывает, что код выполняется, и что в предложении IN для первичного ключа таблицы содержится около 50 целочисленных идентификаторов:

prepare ('UPDATE emailqueue SET SET datesent =' 2015-08-28 19:35:49 'ГДЕ emailqueueid IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ')

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

Помимо уменьшения количества ? в утверждении IN, что еще я могу сделать? Это будет работать для меньших объемов данных. Неужели это действительно считается большим объемом данных для того, чтобы он подавился?

Из phpinfo

mysqli
MysqlI Support  enabled
Client API library version  mysqlnd 5.0.11-dev - 20120503 - $Id: 15d5c781cfcad91193dceae1d2cdd127674ddb3e $ 
Active Persistent Links     0 
Inactive Persistent Links   0 
Active Links    0 

Directive   Local Value
mysqli.allow_local_infile   On
mysqli.allow_persistent On
mysqli.default_host no value
mysqli.default_port 3306
mysqli.default_pw   no value
mysqli.default_socket   /var/lib/mysql/mysql.sock
mysqli.default_user no value
mysqli.max_links    Unlimited
mysqli.max_persistent   Unlimited
mysqli.reconnect    Off

** ОБНОВЛЕНИЕ ** Решением для меня было установить переменную сеанса, используя следующее:

mysqli->query("SET session wait_timeout=28800");
Теги:
mysqli
cron
prepared-statement

2 ответа

0

У меня также возникла эта проблема - после того, как я добавил sleep(60); строка в мой файл во время тестирования.

Основная проблема заключается в том, что истекло время ожидания соединения mysqli. Вы можете проверить это с помощью этого теста:

if ($mysqli->ping()) {
    // Connected.
}
else {
    // Not connected.
}

Чтобы решить вашу проблему, вы можете увеличить значение тайм-аута mysqli (см., Например, http://php.net/manual/en/mysqli.options.php).

И/или, если вы обнаружите, что нет соединения (то есть, используя приведенный выше код до того, как попытаетесь выполнить операцию mysqli), вы сможете повторно установить соединение. (Прежде чем сделать это, может быть необходимо /$mysqli->close(); безопасно вызвать $mysqli->close(); сначала просто чтобы убедиться, что старый ресурс правильно освобожден.)

  • 1
    Спасибо за ваш вклад. Решением для меня было установить mysqli->query("SET session wait_timeout=28800") . Поскольку это старый пост, я обновлю свой вопрос, чтобы отразить это.
0

Попробуйте увеличить эти значения в вашем /etc/my.cnf

max_allowed_packet
wait_timeout
  • 0
    Ваш ответ будет работать, если у меня будет контроль над сервером. Поскольку это общий хост, использование mysqli->query("SET session wait_timeout=28800") было моим решением. Спасибо за ваш вклад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню