PHP后台进程自杀

时间:2014-09-22 16:27:31

标签: php process

我有一个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文件是由我要杀死的进程执行的?我应该考虑一下副作用吗?

1 个答案:

答案 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,则可能无法对发送的信号执行操作。