以下是PHP二补代码文件(即php.exe程序)提供的命令行模式的选项参数,您可以随时通过PHP -h命令查询这些参数。
Usage: php [options] [-f] [args...]
php [options] -r [args...]
php [options] [-- args...]
-s Display colour syntax highlighted source.
-w Display source with stripped comments and whitespace.
-f Parse .
-v Version number
-c | Look for php.ini file in this directory
-a Run interactively
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-z Load Zend extension .
-l Syntax check only (lint)
-m Show compiled in modules
-i PHP information
-r Run PHP without using script tags
-h This help
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
CLISAPI 模块有三种不同的方式来获取您想要运行的 PHP 代码:
在windows环境下,尽量使用双冒号来完成,在linux环境下,尽量使用单冒号来完成。
让PHP运行指定的文件。
php my_script.php
php -f "my_script.php"
上述两种方法(带或不带 -f 参数)也可以运行给定的 my_script.php 文件。 您可以选择任何文件来运行,并且您指定的 PHP 脚本不一定必须具有 .php 扩展名,它们可以具有任何文件名和扩展名。
直接从命令行运行 PHP 代码。
php -r "print_r(get_defined_constants());"
使用这些技术时,请注意 shell 变量的替换和冒号的使用。
注意:请仔细阅读上面的示例,运行代码时没有开始和结束标记! 添加-r参数后,这样的标签就没有必要了,添加会导致句子错误。
提供需要通过标准输入(stdin)运行的PHP代码。
上述用法为我们提供了非常强大的功能,使我们能够动态生成PHP代码并通过命令行运行这些代码,如下例所示:
$ some_application | some_filter | php | sort -u >final_output.txt
以上三种运行代码的方式不能同时使用。
与所有 shell 应用程序一样,PHP 的二进制补码文件 (php.exe) 及其运行的 PHP 脚本接受一系列参数。 PHP不限制传递给脚本程序的参数数量(shell程序对命令行的字符数有限制,但你一般不会超过这个限制)。 传递给脚本的参数可在全局变量 $argv 中找到。 该字段中的零下标成员是脚本的名称(当 PHP 代码来自标准输入并使用 -r 参数直接在命令行上运行时为“-”)。 另外,全局变量$argc存储的是$argv字段中成员变量的数量(不是传递给脚本的参数数量)。
只要传递给脚本的参数不以 - 符号开头,您就不需要过多关注哪些参数。 向脚本传递以 - 开头的参数会导致错误,因为 PHP 会认为它应该自己处理这些参数。 可以使用参数列表分隔符--来解决这个问题。 PHP解析完参数后php命令行执行,该符号后面的所有参数都会原样发送到你的脚本程序中。
# 以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明: $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] [args...] [...] # 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明: $ php -r "var_dump($argv);" -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" }
除此之外,我们还有另一种方法将 PHP 用于 shell 脚本。 您可以编写一个第一行以 #!/usr/bin/php 开头的脚本,后面是包含在 PHP 开始和结束标记中的普通 PHP 代码php命令行执行,然后为文件属性设置正确的运行时。 该方法可以使文件像shell脚本或PERL脚本一样直接执行。
#!/usr/bin/php
假设将文件名改为test并放置在当前目录下,我们可以进行以下操作:
$ chmod 755 test $ ./test -h -- foo array(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" }
正如您所看到的,当您向脚本传递以 - 开头的参数时,脚本仍然可以正常工作。
-------------------------------------------------- -------------------------- 命令选项 -------------------- -- -------------------------------------------
表 23-3。 命令行选项
选项名称 说明
-s
显示源文件并突出显示句子。
此参数使用内置机制来解析文件并生成 HTML 突出显示的版本,并将结果写入标准输出。 请注意,此过程所做的只是生成一个 HTML 标记块,没有任何 HTML 标头。
注意:该选项不能与-r参数同时使用。
-w
显示已删除注释和空格的源代码。
注意:该选项不能与-r参数同时使用。
-F
解析并运行给定的文件名。 该参数是可选的,可以省略,只需指定要运行的文件名即可。
-v
将 PHP、PHPSAPI 和 Zend 版本信息写入标准输出。 例如:
$ php -v PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
-C
通过该参数可以指定放置php.ini文件的目录,也可以直接指定自定义的INI文件,其文件名可以不是php.ini。 例如:
$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php
-A
以交互方式运行 PHP。
-d
使用该参数自行设置php.ini文件中变量的值,句型为:
-d configuration_directive[=value]
例子:
# Ommiting the value part will set the given configuration directive to "1" $ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # Passing an empty value part will set the configuration directive to "" php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) "" # The configuration directive will be set to anything passed after the '=' character $ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(2) "20" $ php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(15) "doesntmakesense"
-e
为调试器等生成扩展信息。
-z
加载 Zend 扩展库。 如果只给出文件名,PHP 将尝试从系统扩展库的默认路径加载扩展(在 Linux 系统下,该路径通常由 /etc/ld.so.conf 指定)。 如果使用绝对路径指定文件名,则不会使用系统默认的扩展库路径。 如果使用相对路径指定文件名,PHP 将仅尝试加载相对于当前目录的扩展库。
-l
该参数提供了一种对指定PHP代码进行句型检测的便捷方法。 如果成功,字符串 NosyntaxerrorsDetectedin 将写入标准输出,但 shell 返回值 0。如果失败,Errorsparsing 和内部解析器错误消息将一起写入标准输出,并且 shell 返回值设置为 255。
该参数将导致难以检测致命错误(例如未定义的函数),如果要检查名称错误,请使用 -f 参数。
注意:该参数不能与-r一起使用。
-m
使用此参数,PHP 将复制外部并加载的 PHP 和 Zend 模块:
$ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
-我
此命令行参数调用 phpinfo() 函数并复制结果。 如果 PHP 无法正常工作,建议您执行 php -i 命令,查看消息表之前或位置是否有错误消息输出。 请注意,输出内容为HTML格式,因此输出信息比较大。
-r
使用此参数在命令行上运行 PHP 代码。 不需要添加PHP开始和结束标识符(),否则会导致句子解析错误。
注意:以这些方式使用 PHP 时,应注意防止与 shell 环境进行的命令行参数替换发生冲突。
显示句子解析错误的示例
$ php -r "$foo = get_defined_constants();" Command line code(1) : Parse error - parse error, unexpected '='
这里的问题是,即使使用双冒号,sh/bash也始终实现了参数替换。 因为 $foo 没有定义,被替换后,它的位置变成了空字符,所以实际上 PHP 在运行时读取的代码是:
$ php -r " = get_defined_constants();"
正确的方法是使用单个冒号 '. 在用单个冒号引用的字符串中,sh/bash 不会将变量恢复为其原始值。
$ php -r '$foo = get_defined_constants(); var_dump($foo);' array(370) { ["E_ERROR"]=> int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [...]
如果您使用 sh/bash 以外的 shell,则可能会遇到其他问题。 请报告您遇到的错误,或发送电子邮件至 phpdoc@lists.php.net。
当你尝试将shell的环境变量引入木马或者使用反斜杠通配符时,也可能会遇到各种问题,使用时请注意!
注意:-r 在 CLISAPI 中有效,在 CGISAPI 中无效。
-H
使用此参数,您可以获得命令行参数的完整列表以及这些参数的作用的简要说明。
PHP的命令行模式使得PHP脚本能够完全独立于WEB服务器运行。 如果你使用Unix系统,你需要在你的PHP脚本的顶部添加一行特殊的代码以便它可以被执行,这样系统就可以知道使用哪个程序来运行该脚本。 在Windows平台下,可以将php.exe与.php文件的双击属性关联起来,也可以编译成批处理文件,用PHP来执行脚本。 对于Unix系统减少的第一行代码不会影响Windows下脚本的运行,因此也可以通过这种方式编译跨平台脚本。 下面是一个简单的 PHP 命令行程序的示例。
案例23-1。 尝试从命令行运行的 PHP 脚本 (script.php)
#!/usr/bin/php
这是一个带有一个选项的命令行 PHP 脚本。
用法:
可以是你想要的一些词
打印输出。 使用--help、-help、-h,
或-?选项,您可以获得此帮助。
在上面的脚本中,我们使用第一行特殊代码来指示该文件应由 PHP 执行。 我们在这里使用 CLI 版本,因此不会输出 HTTP 标头。 当您用 PHP 编写命令行应用程序时,可以使用两个参数:$argc 和 $argv。 后者的值是一个比参数个数大1的整数(运行脚本本身的名称也被视为参数)。 第二个是包含参数的字段,其第一个元素是下标为数字 0 的脚本名称 ($argv[0])。
上面的程序中,我们检测了参数个数是小于1还是大于1,即使参数是--help、-help、-h、-?,我们仍然打印出帮助信息并动态输出同时指定脚本的名称。 如果收到其他参数,我们也会显示它们。
如果你想在Unix下运行上面的脚本,你需要使其可执行,然后只需运行script.phpechothis或script.php-h即可。 在Windows下,您可以这样编译一个批处理文件:
@c:phpcliphp.exe script.php %1 %2 %3 %4
发表评论