MySQL процесс продолжает жить - почему? - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с тем, что процессы mysql остаются живыми.

ПОКАЗАТЬ ПРОЦЕСС; возвращает список процессов. Существуют процессы, которые существуют часами - в соответствии с ID процесса, хостом (портом).

Кажется, что процесс выполняет запрос (SELECT), а не спит, выполняет запрос снова - и это происходит снова и снова. «Время», указанное в PROCESSLIST, сбрасывается после каждого сна.

Как заставить Mysql автоматически убивать такие процессы? Я полагаю, что такой процесс остается активным после истечения времени ожидания сценария PHP (он также выполняет задачу CURL).

[РЕДАКТИРОВАТЬ - отвечать на комментарии]

Запрос: SELECT COUNT(*) FROM keywords WHERE updated < '2018-05-03 00:00:00' AND status = '0' AND active = '1;

столбцы: обновлено (DATETIME), статус (INT) и активный (BOOL) УКАЗАНЫ.

В таблице "ключевые слова" ~ 120К записей.

Мой PHP-скрипт подключается к MySQL через PDO.

Я также установил следующие переменные:

interactive_timeout = 180 wait_timeout = 180

1 Ответ

0 голосов
/ 03 мая 2018

Описанное вами поведение возможно только при постоянных соединениях . Постоянные соединения позволяют PHP повторно использовать предыдущее соединение с базой данных, когда учетные данные совпадают. Хотя есть недостатков , постоянные соединения не обязательно являются плохой вещью, и нет необходимости вручную их удалять.

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

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

После того, как вы его нашли, либо удалите опцию PDO::ATTR_PERSISTENT, либо установите его в false:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => false
));
?>

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

Соединение остается активным в течение всего времени жизни этого объекта PDO . к Чтобы закрыть соединение, вам нужно уничтожить объект , убедившись, что все оставшиеся ссылки на него удаляются - вы делаете это, назначая NULL для переменной, которая содержит объект. Если вы этого не сделаете PHP автоматически закроет соединение, когда ваш Сценарий заканчивается .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...