我使用的是Symfony 2.0 。
我在Symfony中创建了一个命令,我想获取其输出并将其写入文件。
我想要的只是将所有写在标准输出上的内容(在控制台上)放在一个变量中。我指的是在命令中回显的东西,在其他文件中捕获的异常,由命令调用等等。我想在屏幕上和变量中输出(为了在文件中写入变量的内容)。我将在命令的execute()
方法的末尾对文件进行写入。
这样的事情:
protected function execute(InputInterface $input, OutputInterface $output)
{
// some logic and calls to services and functions
echo 'The operation was successful.';
$this->writeLogToFile($file, $output???);
}
在我想要的文件中:
[Output from the calls to other services, if any]
The operation was successful.
你能帮帮我吗?
我试过这样的事情:
$stream = $output->getStream();
$content = stream_get_contents($stream, 5);
但命令并没有以这种方式结束。 :(
答案 0 :(得分:8)
您可以使用php app/console your:command > output.log
的标准shell方法转发命令输出。或者,如果这不是一个选项,您可以为OutputInterface
引入一个包装器,该包装器将写入流,然后将调用转发给包装的输出。
答案 1 :(得分:0)
在我的情况下,我需要做同样的事情,我想通过电子邮件将控制台输出进行调试和审核,然后通过电子邮件发送给电子邮件,因此我制作了一个PHP类包装器,用于存储行数据,然后传递给原始输出实例,仅适用于PHP 7 +。
protected function execute(InputInterface $input, OutputInterface $output) {
$loggableOutput = new class {
private $linesData;
public $output;
public function write($data) {
$this->linesData .= $data;
$this->output->write($data);
}
public function writeln($data) {
$this->linesData .= $data . "\n";
$this->output->writeln($data);
}
public function getLinesData() {
return $this->linesData;
}
};
$loggableOutput->output = $output;
//do some work with output
var_dump($loggableOutput->getLinesData());
}
请注意,这只会存储使用write
和writeln
OutputInterface方法写入的数据,不会存储任何PHP警告等。
答案 2 :(得分:0)
抱歉再次提出这个问题。 我遇到了类似的情况,如果您浏览 Symfony 版本(2.7 及更高版本)的代码,已经有一个 solution。
您可以轻松地将其调整到您的特定问题:
// use Symfony\Component\Console\Output\BufferedOutput;
// You can use NullOutput() if you don't need the output
$output = new BufferedOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
$content = $output->fetch();
这应该可以很好地解决问题。