Это уже проблемы реализации PDO (причем не только в php).
В PDO не существует функции дисконекта, как таковой. Т.е. принудительного, немедленного, закрытия установленного соединения с БД.
Конечно разработчики утверждают что закрыть конект довольно просто, например вот так:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// здесь мы каким-то образом используем соединение
// соединение больше не нужно, закрываем
$dbh = null;
Но маленький финт ушами, в виде вот такого:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// здесь мы каким-то образом используем соединение
$stmt = $pdo->prepare('SELECT * FROM sometable');
$stmt->execute();
// соединение больше не нужно, закрываем
$pdo = null;
//тот самый финт ушами, простое ожидание на 60 секунд
sleep(60);
И ваш конект к базе данных останется живым в течении 60 секунд, не смотря на то что мы его закрыли. А просто потому что скрипт еще не завершил свою работу.
Сейчас в модуле соединения держатся живыми в течении 120 секунд (это делается принудительно). Это было сделано давно, и вроде это было по причине того, что на хостингере при большом интервале между запросами появлялась ошибка соединения с БД.
Т.е. шли начальные запросы в БД с установкой кодировок и прочего, потом был некоторый момент простоя, для получения данных из АПИ ВГ, и когда скрипт опять пытался соединиться с БД, для внесения полученных данных (тогда данные хранились прямо в БД а не в кэше как сейчас) их сервер думал что соединение уже прервано. И отваливался с ошибкой.
Так что похоже на то, что ошибку создают аякс вкладки. Которые по сути отдельно выполняемые скрипты, которые тоже устанавливают соединение с БД.
Но сами понимаете, если убрать поддержание соединения в течении 120 секунд, опять вылезет ошибка, с отваливающейся БД. Палка о двух концах, хех.
Есть несколько вариантов работы над данной проблемой (в данный момент я вижу как минимум два).
Можно попробовать постоянные соединения, которые кэшируются, и тогда аякс вкладки должны пытаться использовать уже открытое соединение, а не создавать новое. Но это теория, на практике боюсь все будет не так гладко. Там тоже есть свои подводные камни
.
Можно создать функцию, которая будет вызываться в конце работы скрипта, и обрывать соединение с бд, освобождая слот.
В общем, надо проверить все это, и совместимы ли эти методы. И какие результаты они дадут. Т.к. до этого о подобных проблемах пока еще не сообщали, и в этом направлении мы еще не работали.