PHP是否支持进程替换?

时间:2016-08-08 13:58:14

标签: php shell command-line-interface stdin process-substitution

我正在尝试以下示例,例如:

$ php -r 'require_once($argv[1]);' <(echo "hello")

或:

$ php -r 'file_get_contents($argv[1]);' <(echo "hello")

都失败了:

  

PHP警告:require_once(/ dev / fd / 63):无法打开流:第1行的命令行代码中没有此类文件或目录

     

PHP警告:file_get_contents(/ dev / fd / 63):无法打开流:第1行的命令行代码中没有此类文件或目录

或:

$ php -r 'file_get_contents($argv[0]);' < <(echo "hello")

失败了:

  

PHP致命错误:require_once():在第1行的命令行代码中打开所需的' - '(include_path ='。:/ usr / share / pear:/ usr / share / php')失败

上述尝试受drush命令的启发,例如:

$ drush --early=<(echo print 123';') ""
[warning] require_once(/dev/fd/63): failed to open stream: No such file or directory preflight.inc:58

我可以从文件描述符中注入动态PHP代码(每次都不创建单独的文件),以便在引导主代码之前执行代码。

其他类似的命令工具可以正常工作:

$ cat <(echo "hello")
hello

或:

$ python -c "import sys; print sys.stdin.readlines()" < <(echo "hello")
['hello\n']

我找到了这个PHP bugthis one,但这些已经很久以前修复了,我使用的是5.6.22。

有什么方法可以让我通过使用一些简单的单行程序来欺骗PHP从进程替换中读取数据(从文件描述符中读取,例如/dev/fd),使用一些简单的单行程序?

1 个答案:

答案 0 :(得分:1)

错误消息提供了一个很好的提示:PHP无法找到给定的文件。

但等等,什么文件?好吧,让我们记住process substitution是什么:

  

进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)显示为临时文件。

因此,当您打印出以这种方式提供的参数时,您会看到:

$ php -r 'print $argv[1];' <(echo "a")

对我而言,它返回以下临时文件:

/dev/fd/63

所以是的,您可以使用PHP替换进程,但不能用于此。

如果你想要的是使用命令的输出作为参数,只需使用$()来扩展它:

$ php -r 'print $argv[1];' "$(echo "hello man")"
hello man