Вот, что он мне в итоге выдал:
сперва попросил показать mysql.php
Если скинешь mysql.php — я тебе под него сделаю точечный патч, без «колхоза» и риска сломать проект.
я показал, вот ниже вердикт... но сходу внедрять это как-то боязно, хотел бы сперва обсудить с разработчиком, так сказать... так как, вам оно всё же виднее)) Ну, а если совет действительно толковый (выгядит всё логично на мой дилетантский взгляд), то может просто это в ап добавить?
У тебя вообще нет автопереподключения при потере соединения.
Да, есть:
function db_ping($link = 'db_link') {
global $$link;
if (!mysqli_ping($$link)) {
return false;
}
return true;
}
То есть:
соединение умерло
$db_link остался
mysqli_query() → 2006
дальше db_error → лог
В db_connect:
$db_server = (isset($connect_config["db_persistent"]) and $connect_config["db_persistent"])
? ('p:' . $connect_config["db_server"])
: $connect_config["db_server"];
Если в конфиге:
db_persistent = true
→ ты используешь persistent connections (p:).
MySQL может закрыть persistent socket → PHP получает труп.
Это классический источник 2006.
В while ($tries < 3) ты ретраишь только:
1205 (lock wait timeout)
1213 (deadlock)
А 2006 — нет.
То есть reconnect не делается.
Мы:
🛠 Вставь в mysql.php (1 раз — и забудешь)
И в начале, после:
if (!$$link) {
ВСТАВЬ:
// --- AUTO RECONNECT ---
if (!mysqli_ping($$link)) {
mysqli_close($$link);
$$link = db_connect($link);
}
В итоге будет так:
if (!$$link) {
...
}
// AUTO RECONNECT
if (!mysqli_ping($$link)) {
mysqli_close($$link);
$$link = db_connect($link);
}
Найди:
if (!$result and (mysqli_errno($$link) == 1205 or mysqli_errno($$link) == 1213) ) {
ЗАМЕНИ на:
if (
!$result and (
mysqli_errno($$link) == 1205 ||
mysqli_errno($$link) == 1213 ||
mysqli_errno($$link) == 2006
)
) {
И внутрь добавь reconnect:
if (mysqli_errno($$link) == 2006) {
mysqli_close($$link);
$$link = db_connect($link);
}
В итоге:
if (
!$result and (
mysqli_errno($$link) == 1205 ||
mysqli_errno($$link) == 1213 ||
mysqli_errno($$link) == 2006
)
) {
if (mysqli_errno($$link) == 2006) {
mysqli_close($$link);
$$link = db_connect($link);
}
$tries++;
sleep(1);
continue;
}
Найди:
db_persistent
Если есть:
true
false
или удали вообще.
Для cron — persistent противопоказан.
После патча:
→ никаких 2006.
В db_connect можно добавить:
mysqli_options($$link, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
Перед connect — защита от зависаний.
Твоя ошибка — архитектурная, не серверная.
Причина:
Решение:







