我有一个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 :(得分:1)
对于Windows,您可以使用/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时执行完全不同的操作。此外,如果应用程序处于错误状态,例如等待磁盘I / O,则可能无法对发送的信号执行操作。