3

我的问题与在 CLI 中使用 PHP 有关。我不知道为什么将 PHP 文件的内容通过管道传输到 PHP 命令的工作原理:

    cat file.php | php  

就像在 Composer 的安装中一样Composer Installation

    curl -sS https://getcomposer.org/installer | php
4

3 回答 3

6

如果您不向 PHP 提供任何参数,它将从标准输入(通常称为stdin)中读取。如果您的输出缓冲被禁用,您可以尝试php不带参数运行,然后键入<?php echo "test\n";+ Enter,您将看到“测试”。stdin基本上是键盘写入的流,基本上stdout终端写入的地方echo

在此处输入图像描述

但是 pipe ( |) 改变了这种行为:第一个程序的标准输出变成了第二个程序的标准输入。

在此处输入图像描述

这是我们的 nix 系统 shell 提供的一个非常强大的功能 :-)。

于 2013-05-01T21:14:41.000 回答
0

通常你不会那样做,而只是简单地执行文件php file.php。在这种情况下,无论出于何种原因你想这样做,你需要用引号括起来

php -r "`cat file.php`"

编辑您也可以这样做。

像这样在文件的前面放一个 hashbang

#!/usr/bin/env php 
<?php

//code follows here

然后执行

cat file.php | php
于 2013-05-01T18:27:56.523 回答
0

至于“为什么起作用”:它起作用是因为 PHP 二进制文件的 -cli 变体被设计为交替地从那里读取stdin和处理输入脚本。

手册页列出了各种执行选项。看最后一行:

PHP 是一种广泛使用的通用脚本语言,特别适用于 Web 开发并且可以嵌入到 HTML 中。这是使您能够执行以下操作的命令行界面:

您可以使用参数 -f 后跟要执行的文件的名称来解析和执行文件。

使用参数 -r,您可以像使用 eval() 函数时在 .php 文件中一样直接执行 PHP 代码。

也可以使用参数 -R 或 -F 逐行处理标准输入。在这种模式下,每个单独的输入行都会导致执行 -R 指定的代码或 -F 指定的文件。您可以通过 $argn 访问输入行。在处理输入行时,$argi 包含正在处理的实际行的编号。此外,参数 -B 和 -E 可用于在分别处理所有输入行之前和之后执行代码(参见 -r)。请注意,输入是从 STDIN 读取的,因此从 STDIN 读取会显式更改下一个输入行或跳过输入行。

如果 -r -f -B -R -F 或 -E 都不存在,但给出了单个参数,则将此参数作为要解析和执行的文件名(与 -f 相同)。如果不存在参数,则读取并执行标准输入。

于 2013-05-01T18:30:35.647 回答