【问题标题】:using php from command line: how to redirect output?从命令行使用 php:如何重定向输出?
【发布时间】:2014-09-17 15:24:58
【问题描述】:

我是 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

现在,如果我有一个 PHP 文件而不是函数,如何获得相同的输出?

// my script.php
echo "bubu";
echo "gaga";

Bash 脚本:

#!/bin/bash

# myscript.sh

a=$(php myscript.php)
echo $a > t

如果我在 shell 中运行它,我会得到:

$ ./myscript.sh
$ cat t
bubu
gaga

如何告诉 php 脚本将"bubu" 发送到/dev/tty

我尝试和ob_start 和他的朋友一起玩,但没有得到任何结果。

【问题讨论】:

    标签: php bash shell


    【解决方案1】:

    您可以在 PHP 中使用 stdout/stderr 来拆分输出,请参阅 stackoverflow 问题 PHP CLI doesn't use stderr to output errors。然而,这需要将myscript.php 中的所有“bubu”echo 语句调整为:

    fwrite(STDERR, "bubu");
    

    然后您将 stderr 重定向到 Bash 包装器中的文件 bubu 以获取所有“bubu”行,而所有“gaga”行将出现在您的终端上:

    php myscript.php 2> bubu
    

    【讨论】:

    • 感谢 michael... 但是:php 中有没有办法在不写入文件的情况下向 stderr 发送内容?如果在 cicle 内运行,听起来相当昂贵,不是吗?
    • fwrite 在这种情况下不会写入实际文件,因此 PHP 部分没有磁盘 I/O。但是,您不应为每次写入调用fopen,只需在程序启动时执行一次即可。还有另一种使用error_log() 的方法,除非将error_log 设置为特定文件,但与fwrite 相比,这会进一步降低性能。我的测试设置(一个简单的循环)完成了 10000 次迭代,echo 在 35 毫秒内完成,fwrite 在 41 毫秒内完成,error_log 在 45 毫秒内完成。
    • 太好了,这听起来绝对是一个很好的解决方案……非常感谢!
    • 您甚至不需要在命令行中打开该流句柄。我已经相应地编辑了答案。
    【解决方案2】:
    $ php script.php > /dev/tty
    

    这就是诀窍:)

    编辑/

    我明白了,你只想要“bubu”

    所以,您应该执行以下操作:

    file_put_contents('/dev/tty', 'bubu');
    

    【讨论】:

    • 这会将所有内容发送到那里(无论如何这已经是默认设置)并且不会按照 OP 想要的方式拆分输出)。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多