2014-09-22 95 views
0

我有,我用它来在后台运行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(); 
} 

我想知道的是,有可能在第e结束循环,下面的命令:

$process->kill(); 

考虑到这个php文件是由我要杀的进程执行的吗?有什么副作用我应该考虑?

+0

你只是想停止一个PHP过程?这是否正在运行多线程? – 2014-09-22 17:29:00

+0

嗯....我没有准备好多线程的任何东西,但它应该能够一次运行多个实例。我想知道的是,如果shell_exec('kill'。$ this-> pid)之后有任何代码,会被执行,或者会立即停止。如果我不能更精确,我很抱歉,但是我对流程管理的知识非常薄弱,我不得不快速学习基本知识:P – sergio0983 2014-09-22 18:38:18

回答

1

对于您可以使用/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),则可能无法对发送的信号执行操作。