2014-09-22 53 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),則可能無法對發送的信號執行操作。