Некоторое время назад я искал способ сохранения скрипта PHP, когда пользователь прерывается. (Когда пользователь закрыл браузер). Мне нужно было это для некоторых длинных запросов, чтобы завершить, даже если пользователь решил уйти.
ignore_user_abort(1);
set_time_limit(0);
while (true) {
// Do queries
}
Как я могу убить вышеупомянутый скрипт?
getmypid()
предложили функцию getmypid()
. Теперь я реализовал следующее:
ignore_user_abort(1);
set_time_limit(0);
// Get process id
$pid = getmypid();
$stmt = "INSERT INTO processes (pid, started) VALUES ('".$pid."', NOW())";
while (true) {
// Do Queries
if ($query) {
break;
}
}
$stmt = "UPDATE processes SET ended=NOW() WHERE pid='".$pid."'";
Теперь я могу запросить базу данных, чтобы увидеть, что процессы hwat еще не закончены. Я буду знать, что эти процессы застряли.
Вы можете убить процесс php, идентифицируя идентификаторы процессов. но что вы должны выполнить непосредственно с терминала, войдя в систему как пользователь root. Его плохой подход, чтобы предоставить привилегии для www-data (php user), чтобы убить процесс.
Лучший подход: внутри цикла вам нужно проверить любой флаг, хранящийся в базе данных, чтобы продолжить, иначе выйти. Таким образом, вы легко можете легко управлять этим флагом базы данных с помощью кода.
ignore_user_abort()
имеет отношение к остановке выполнения текущей страницы PHP, когда клиент (пользователь браузера) закрывает свой браузер. Это не остановит ваш PHP-код. Поэтому die;
при условии или изменении set_time_limit()
может убить ваш PHP-скрипт.
Ваш код может выглядеть примерно так:
set_time_limit(200); ignore_user_abort(1);
include 'connection.php'; $db = db();
// do queries like normal not in a continuous loop
if($q = $db->query(/**/)){
if($q->num_rows > 0){
// do stuff
}
}
else{
die;
}