1

假设我有以下 Symfony 4 命令:

class Command1  extends Command {
    protected static $defaultName = 'app:command1';

    protected function execute(InputInterface $input, OutputInterface $output){
        $process = new Process('bin/console list', getcwd());
        $process->start(); // or even $process->run() does not matter if its async or not
        // ... where we handle if its finished, etc...
    }
}

如果我简单地调用bin/console app:command1它将返回预期的命令列表。基本上按我的预期工作。

但是,如果我有一个使用Symfony\Component\Console\Application::run()启动此命令的 phpunit 测试,我最终会Symfony\Component\Process::wait()

do {
    $this->checkTimeout();
    $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
    $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
} while ($running);

$this->processPipes->areOpen()永远开放的地方。

在我看来,如果我通过 phpunit 在进程中使用任何 Symfony 控制台命令,总会有两个管道像这样打开:

1 = {resource} resource id='x' type='stream'
2 = {resource} resource id='z' type='stream'

但我不知道这些实际上是什么。我还在 htop 中看到,start()proc_open实际上启动了一个新进程,但它只是挂起(完全没有做任何事情,甚至无法调试它),直到超时。错误日志中没有任何内容(超时除外)。

4

0 回答 0