执行 PHP 文件

有三种不同的方法可以将 CLI SAPI 与要执行的 PHP 代码一起使用

  1. 告诉 PHP 执行某个文件。

    $ php my_script.php
    
    $ php -f my_script.php
    

    两种方法(无论是否使用 -f 开关)都执行文件 my_script.php。请注意,对可以执行的文件没有限制;特别是,文件名不需要具有 .php 扩展名。

  2. 将要执行的 PHP 代码直接传递到命令行。

    $ php -r 'print_r(get_defined_constants());'
    

    必须注意 shell 变量替换和引号的使用。

    注意:

    仔细阅读示例:没有开始或结束标签!-r 开关根本不需要它们,使用它们会导致解析错误。

  3. 通过标准输入 (stdin) 提供要执行的 PHP 代码。

    这提供了强大的能力来动态创建 PHP 代码并将其提供给二进制文件,如以下(虚构的)示例所示

    $ some_application | some_filter | php | sort -u > final_output.txt
    
不能将三种执行代码的方法中的任何一种结合起来。

与每个 shell 应用程序一样,PHP 二进制文件接受许多参数;但是,PHP 脚本也可以接收更多参数。传递给脚本的参数数量不受 PHP 限制(尽管 shell 对可以传递的字符数量有限制,但这通常不太可能遇到)。传递给脚本的参数在全局数组 $argv 中可用。第一个索引(零)始终包含从命令行调用的脚本的名称。请注意,如果使用命令行开关 -r 内联执行代码,则 $argv[0] 的值将为 "Standard input code";在 PHP 7.2.0 之前,它是一个连字符 ("-") 。如果代码通过来自 STDIN 的管道执行,则情况也是如此。

第二个全局变量 $argc 包含 $argv 数组中的元素数量(不是传递给脚本的参数数量)。

只要传递给脚本的参数不以 - 字符开头,就没有什么特殊需要注意的。传递给脚本以 - 开头的参数会导致问题,因为 PHP 解释器认为它必须自己处理它,甚至在执行脚本之前。为了防止这种情况,请使用参数列表分隔符 --。在 PHP 解析此分隔符后,所有后续参数都将完整地传递给脚本。

# This will not execute the given code but will show the PHP usage
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# This will pass the '-h' argument to the script and prevent PHP from showing its usage
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

但是,在 Unix 系统上,还有另一种使用 PHP 进行 shell 脚本的方法:使脚本的第一行以 #!/usr/bin/php 开头(或者,如果与你的 PHP CLI 二进制文件的路径不同)。文件其余部分应包含常规 PHP 代码,位于通常的 PHP 开始和结束标签中。一旦文件的执行属性被适当地设置(例如 chmod +x test),脚本就可以像任何其他 shell 或 perl 脚本一样执行

示例 #1 以 shell 脚本形式执行 PHP 脚本

#!/usr/bin/php
<?php
var_dump
($argv);
?>

假设此文件在当前目录中名为 test,现在可以执行以下操作

$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

正如所见,在这种情况下,传递以 - 开头的参数时无需格外小心。

PHP 可执行文件可用于完全独立于 Web 服务器运行 PHP 脚本。在 Unix 系统上,特殊 #!(或“shebang”)第一行应添加到 PHP 脚本中,以便系统可以自动确定哪个程序应该运行脚本。在 Windows 平台上,可以将 php.exe.php 扩展名的双击选项关联,或者可以创建批处理文件以通过 PHP 运行脚本。Unix 的特殊 shebang 第一行在 Windows 上不会造成伤害(因为它被格式化为 PHP 注释),因此可以通过包含它来编写跨平台程序。下面显示了一个编写命令行 PHP 程序的简单示例。

示例 #2 旨在从命令行运行的脚本 (script.php)

#!/usr/bin/php
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

这是一个只有一个选项的命令行 PHP 脚本。

用法
<?php echo $argv[0]; ?> <option>

<option> 可以是你想要的任何单词
打印出来。使用 --help、-help、-h
或 -? 选项,你可以获得此帮助。

<?php
} else {
echo
$argv[1];
}
?>

上面的脚本包含 Unix shebang 第一行为表示此文件应由 PHP 运行。我们在这里使用的是 CLI 版本,因此不会输出任何 HTTP 标头。

程序首先检查是否有所需的单个参数(除了脚本名称外,也将其计算在内)。如果没有,或者如果参数是 --help-help-h-?,则使用 $argv[0] 动态打印命令行中键入的脚本名称,输出帮助消息。否则,将按原样回显参数。

要在 Unix 上运行上述脚本,必须将其设为可执行文件,并简单地调用 script.php echothisscript.php -h。在 Windows 上,可以为执行此任务创建类似于以下的批处理文件

示例 #3 用于运行命令行 PHP 脚本的批处理文件 (script.bat)

@echo OFF
"C:\php\php.exe" script.php %*

假设上述程序名为 script.php,并且 CLI php.exe 位于 C:\php\php.exe 中,此批处理文件将运行它,并传递所有附加的选项:script.bat echothisscript.bat -h

另请参阅 Readline 扩展文档,以获取可用于增强 PHP 中命令行应用程序的更多函数。

在 Windows 上,PHP 可以配置为运行而无需提供 C:\php\php.exe.php 扩展名,如 Microsoft Windows 上的命令行 PHP 中所述。

注意:

在 Windows 上,建议在实际用户帐户下运行 PHP。在网络服务下运行时,某些操作将失败,因为“没有在帐户名称和安全标识符之间进行映射”。

添加注释

用户贡献的注释 7 个注释

php at richardneill dot org
11 年前
在 Linux 上,内核最多将 shebang(#!)行解析为两个部分。
例如

1: #!/usr/bin/php
2: #!/usr/bin/env php
3: #!/usr/bin/php -n
4: #!/usr/bin/php -ddisplay_errors=E_ALL
5: #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. 是启动脚本的标准方式。(比较“#!/bin/bash”。)

2. 使用“env”查找 PHP 安装位置:它可能位于 $PATH 中的其他位置,例如 /usr/local/bin。

3. 如果你不需要使用环境变量,你可以在这里传递一个参数。例如,要忽略系统的 PHP.ini 并使用默认值,请使用“-n”。(参见“man php”)。

4. 或者,你可以设置一个配置变量。我推荐使用这种方法,因为如果在这里设置了 display_errors,它实际上会生效。否则,唯一可以启用它的位置是在 php.ini 中的系统范围。如果你尝试在你的脚本中使用 ini_set(),就太迟了:如果你的脚本有解析错误,它会静默地退出。

5. 这在 2013 年之后在 Linux 上不起作用。它会像“-n -ddisplay_errors=E_ALL”整个字符串是一个参数一样。但在 BSD 中,shebang 行可以接受超过 2 个参数,因此它可能按预期工作。

总结:使用 (2) 确保最大程度的移植性,使用 (4) 确保最大程度的调试。
email at alexander-bombis dot de
3 年前
对于 Windows

经过多年后,我发现我必须在 Windows shell 中的 php -r 后面使用双引号。

但是在 Powershell 中,你可以使用单引号或双引号!
gabriel at figdice dot org
7 年前
关于 shebang

在 Linux 和 Windows 中,当你使用 CLI 执行脚本时

php script.php

那么 PHP 将会忽略脚本的第一行,如果它以

#!

所以,这行不仅在脚本文件可执行时被内核吸收,而且也被 PHP 引擎本身忽略。

但是,引擎不会忽略“外部”脚本 script.php 中包含的任何文件的第一个 #! 行。
任何包含脚本中的“shebang”行,只会将该行输出到 STDOUT,就像任何其他位于 <?php ... ?> 块之外的文本一样。
david at frankieandshadow dot com
8 年前
在文件开头使用 #!/usr/bin/php 时的一个陷阱

如果你最初在 Windows 上编辑了文件,然后尝试在 Unix 上使用它,它将无法工作,因为 #! 行需要 Unix 行结尾。如果它有 DOS 行结尾,Bash 会给出以下错误消息
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"

(在 Emacs 中,我使用“CTRL-X ENTER f”,然后输入“unix”并 ENTER 转换)
spencer at aninternetpresence dot net
13 年前
如果你在 Windows 上运行 CLI 并使用“-r”选项,请确保将你的 PHP 代码放在双引号(而不是单引号)中。否则,你的代码将无法运行。
petruzanautico at yah00 dot com dot ar
12 年前
由于你不能同时使用 -r 和 -f,你可以通过以下方法绕过这个问题
php -r '$foo = 678; include("your_script.php");'
synnus at gmail dot com
6 年前
在 php.ini 中使用 auto_prepend_file="init.php"
第一个启动脚本
To Top