2016-03-24 6 views
2

После запуска встроенного PHP-сервера с proc_open я, похоже, не могу его убить. Безопасные процессы убийства начались с proc_open

$this->process = proc_open("php -S localhost:8000 -t $docRoot", $descriptorSpec, $pipes); 
// stuff 
proc_terminate($this->process); 

Сервер работает, однако он не хочет, чтобы закрыть процесс. Я также попытался:

$status = proc_get_status($this->process); 
posix_kill($status['pid'], SIGTERM); 
proc_close($this->process); 

Я также попытался SIGINT и SIGSTOP ... не использовать SIGSTOP.

is a solution используя ps однако я бы , как, чтобы поддерживать его независимым от ОС.

Полный код:

class SimpleServer 
{ 

    const STDIN = 0; 
    const STDOUT = 1; 
    const STDERR = 2; 

    /** 
    * @var resource 
    */ 
    protected $process; 

    /** 
    * @var [] 
    */ 
    protected $pipes; 

    /** 
    * SimpleAyeAyeServer constructor. 
    * @param string $docRoot 
    */ 
    public function __construct($docRoot) 
    { 
     $docRoot = realpath($docRoot); 

     $descriptorSpec = [ 
      static::STDIN => ["pipe", "r"], 
      static::STDOUT => ["pipe", "w"], 
      static::STDERR => ["pipe", "w"], 
     ]; 
     $pipes = []; 

     $this->process = proc_open("php -S localhost:8000 -t $docRoot", $descriptorSpec, $pipes); 

     // Give it a second and see if it worked 
     sleep(1); 
     $status = proc_get_status($this->process); 
     if(!$status['running']){ 
      throw new \RuntimeException('Server failed to start: '.stream_get_contents($pipes[static::STDERR])); 
     } 
    } 

    /** 
    * Deconstructor 
    */ 
    public function __destruct() 
    { 
     $status = proc_get_status($this->process); 
     posix_kill($status['pid'], SIGSTOP); 
     proc_close($this->process); 
    } 
} 

ответ

0

Использование proc_terminate

Это правильная функция, чтобы убить процесс, запущенный proc_open()

proc_terminate($status['pid'], 9);

+1

'proc_terminate' был первым, что я пытался (см выше). Я не пробовал «SIGKILL», но даже это, похоже, не убивает. Мне интересно, если это какая-то причуда встроенного PHP-сервера. – DanielM