PHP фоновый процесс убивает себя

У меня есть класс PHP, который я использую для запуска файлов сценариев php в фоновом режиме, например:

Class BackgroundScript{
public $win_path = "C:\\xampp\\htdocs\\www\\project";
public $unix_path = "/home/my_folder/project.com";
public $script = NULL;
public $command = NULL;
public $pid = NULL;
public $start_time = NULL;
public $estimated_time = NULL;
public $ellapsed_time = NULL;
public $status_file = NULL;
...

public function kill(){
$this->removeFile();
if ( self::get_os() == "windows" ){
shell_exec(" taskkill /PID ".$this->pid);
} else{
shell_exec('kill '.$this->pid);
}
}
}

Это называется так:

$argvs = " var1 var2 ";
$process = new BackgroundScript("controller.php processCSV $argvs");

Затем он создает процесс, который в фоновом режиме выполняет код, подобный следующему:

$current_process = BackgroundProcess::getByPID(getmypid());
for ($=1; $i< 100; $i++){
performLongRunningTask();
$current_process->updateStatus();
}

Что я хочу знать, так это то, что в конце цикла можно добавить следующую команду:

$process->kill();

Учитывая, что этот файл php выполняется процессом, который я хочу убить? И есть ли побочные эффекты, которые я должен рассмотреть?

0

Решение

Для окон вы можете использовать /F заставить убить:

taskkill /F /PID YOUR_PID

Для Linux вы можете использовать синтаксис: kill [signal or option] PID(s) Варианты, которые вы можете использовать:

SIGHUP      1       Hangup (the default and safest way to kill a process)
SIGKILL     9       Kill Signal (less secure way of killing a process)
SIGTERM     15      Terminate (the most unsafe way to kill a process which terminates a process without saving)

Когда вы используете kill '.$this->pid он отправит сигнал SIGTERM. Несколько вещей могут произойти здесь:

  • процесс может немедленно остановиться
  • процесс может остановиться после небольшой задержки после очистки ресурсов
  • процесс может продолжаться бесконечно

Приложение может определить, что оно хочет сделать после получения SIGTERM. Хотя большинство приложений будут очищать свои ресурсы и останавливаться, некоторые могут этого не делать. Приложение может быть настроено на что-то совершенно другое при получении SIGTERM. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]