使用proc_open启动安全终止进程



用proc_open启动PHP内置服务器后,我似乎无法杀死它。

$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);

我也试过SIGINTSIGSTOP。。。不要使用SIGSTOP

有一个使用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);
    }
}

使用proc_terminate

proc_open() 启动的进程终止是正确的功能

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

最新更新