假设我有以下 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
实际上启动了一个新进程,但它只是挂起(完全没有做任何事情,甚至无法调试它),直到超时。错误日志中没有任何内容(超时除外)。