首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP支持进程替换吗?

问PHP支持进程替换吗?
EN

Stack Overflow用户
提问于 2016-08-08 13:58:14
回答 1查看 373关注 0票数 1

我尝试了以下示例,如:

代码语言:javascript
复制
$ php -r 'require_once($argv[1]);' <(echo "hello")

或者:

代码语言:javascript
复制
$ php -r 'file_get_contents($argv[1]);' <(echo "hello")

两者都失败了,比如:

PHP警告: require_once(/dev/fd/63):未能打开流:第1行命令行代码中没有这样的文件或目录 PHP警告: file_get_contents(/dev/fd/63):未能打开流:第1行命令行代码中没有这样的文件或目录

或者:

代码语言:javascript
复制
$ php -r 'file_get_contents($argv[0]);' < <(echo "hello")

在以下几个方面都失败了:

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

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

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

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

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

代码语言:javascript
复制
$ cat <(echo "hello")
hello

或者:

代码语言:javascript
复制
$ python -c "import sys; print sys.stdin.readlines()" < <(echo "hello")
['hello\n']

我已经找到了这个PHP bug和这一个,但是它们很久以前就已经修复了,我使用的是5.6.22。

我是否可以通过使用简单的一行程序从进程替换(从文件描述符(如/dev/fd)中读取数据)来欺骗PHP?

EN

回答 1

Stack Overflow用户

发布于 2016-08-08 14:04:39

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

等等,什么文件?好吧,让我们记住过程替代是什么:

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

所以,当你打印论点时,你是这样提供的:

代码语言:javascript
复制
$ php -r 'print $argv[1];' <(echo "a")

对我来说,它返回以下临时文件:

代码语言:javascript
复制
/dev/fd/63

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

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

代码语言:javascript
复制
$ php -r 'print $argv[1];' "$(echo "hello man")"
hello man
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38831168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档