从命令行使用php:如何重定向输出?
我是一个PHP新手。。。我通常使用bash编写脚本,在这里我可以轻松地执行以下操作:从命令行使用php:如何重定向输出?,php,bash,shell,Php,Bash,Shell,我是一个PHP新手。。。我通常使用bash编写脚本,在这里我可以轻松地执行以下操作: #!/bin/bash # myscript.sh function testFunction() { echo "bubu" > /dev/tty echo "gaga" } a=$(testFunction) echo $a > t 如果我在shell中运行它,我会得到以下结果: $ ./myscript.sh bubu $ cat t gaga $ ./myscript.sh $
#!/bin/bash
# myscript.sh
function testFunction() {
echo "bubu" > /dev/tty
echo "gaga"
}
a=$(testFunction)
echo $a > t
如果我在shell中运行它,我会得到以下结果:
$ ./myscript.sh
bubu
$ cat t
gaga
$ ./myscript.sh
$ cat t
bubu
gaga
现在,如果我有一个PHP文件而不是函数,如何获得相同的输出
// my script.php
echo "bubu";
echo "gaga";
Bash脚本:
#!/bin/bash
# myscript.sh
a=$(php myscript.php)
echo $a > t
如果我在shell中运行它,我会得到以下结果:
$ ./myscript.sh
bubu
$ cat t
gaga
$ ./myscript.sh
$ cat t
bubu
gaga
如何告诉php脚本将“bubu”
发送到/dev/tty
我试着和ob_start和他的朋友们一起玩,但没有得到任何结果
$ php script.php > /dev/tty
这就是诀窍:)
编辑/
我明白了,你只想要“bubu”
因此,您应该执行以下操作:
file_put_contents('/dev/tty', 'bubu');
您可以在PHP中使用stdout/stderr分割输出,请参见stackoverflow问题。然而,这需要将
myscript.php
中的所有“bubu”echo
语句调整为如下内容:
fwrite(STDERR, "bubu");
然后将stderr重定向到Bash包装器中的文件bubu
,以获取所有“bubu”行,而所有“gaga”行将显示在终端上:
php myscript.php 2> bubu
这会将所有内容发送到那里(这在某种程度上已经是默认的),并且不会按照OP想要的方式分割输出。谢谢michael。。。但是:在php中有没有一种方法可以在不写入文件的情况下向stderr发送某些内容?如果在cicle中运行,它听起来相当昂贵,不是吗?
fwrite
在这种情况下不会写入实际文件,因此PHP部分没有磁盘I/O。您不应该为每次写入调用fopen
,但只需在程序启动时调用一次即可。还有另一种使用的方法,除非将error\u log
设置为特定文件,但与fwrite
相比,这会进一步降低性能。我的测试设置(一个简单的循环)完成了10000次迭代,其中echo
在35毫秒内完成,fwrite
在41毫秒内完成,而error\u log
在45毫秒内完成。太好了,这绝对是一个不错的解决方案。。。非常感谢!您甚至不需要在命令行中打开该流句柄。我已相应地编辑了答案。