Убить PHP-скрипт, использующий ignore_user_abort ()

1

Некоторое время назад я искал способ сохранения скрипта 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 еще не закончены. Я буду знать, что эти процессы застряли.

  • 1
    1. убив процесс, выполняющий этот скрипт и 2. за то, что на обработку уходит больше времени, вы должны вместо этого взглянуть на систему очередей.
  • 0
    Что это за событие, когда вы хотите убить этот скрипт?
Показать ещё 9 комментариев
Теги:

2 ответа

3
Лучший ответ

Вы можете убить процесс php, идентифицируя идентификаторы процессов. но что вы должны выполнить непосредственно с терминала, войдя в систему как пользователь root. Его плохой подход, чтобы предоставить привилегии для www-data (php user), чтобы убить процесс.

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

  • 0
    Откуда мне знать, какие процессы убивать?
  • 1
    Вы можете использовать функцию getmypid () в самом запущенном процессе php. php.net/manual/en/function.getmypid.php .
1

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;
}

Ещё вопросы

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