原来PHP也有命令行模式(CLI)

从 PHP 4.3.0开始,CLI/CGI 二进制执行文件的文件名、位置和是否存在会根据 PHP 在系统上的安装而不同。在默认情况下,当运行 make 时,CGI 和 CLI 都会被编译并且分别放置在 PHP 源文件目录的 sapi/cgi/php 和 sapi/cli/php 下。可以注意到两个文件都被命名为了 php。在 make install 的过程中会发生什么取决于配置行。

PHP 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,随时可以运行带 -h 参数的 PHP 命令来查询这些参数。

Usage: php [options] [-f] [--] [args...]
php [options] -r [--] [args...]
php [options] [-B ] -R [-E ] [--] [args...]
php [options] [-B ] -F [-E ] [--] [args...]
php [options] — [args...]
php [options] -a

-a Run interactively
-c | Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value ‘bar’
-e Generate extended information for debugger/profiler
-f Parse .
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r Run PHP without using script tags
-B Run PHP before processing input lines
-R Run PHP for every input line
-F Parse and execute for every input line
-E Run PHP after processing all input lines
-H Hide any passed arguments from external tools.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z Load Zend extension .

args… Arguments passed to script. Use — args when first argument
starts with - or script is read from stdin

PHP 的二进制文件(php.exe 文件)及其运行的 PHP 脚本能够接受一系列的参数。PHP 没有限制传送给脚本程序的参数的个数(外壳程序对命令行的字符数有限制,但通常都不会超过该限制)。传递给脚本的参数可在全局变量 $argv 中获取。该数组中下标为零的成员为脚本的名称(当 PHP 代码来自标准输入获直接用 -r 参数以命令行方式运行时,该名称为“-”)。另外,全局变量 $argc 存有 $argv 数组中成员变量的个数(而非传送给脚本程序的参数的个数)。

只要传送给脚本的参数不是以 - 符号开头,就无需过多的注意什么。向脚本传送以 - 开头的参数会导致错误,因为 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 用于外壳脚本。可以在写一个脚本,并在第一行以 #!/usr/bin/php 开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性(例如:chmod +x test)。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。

#!/usr/bin/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”
}

正如所看到的,在向该脚本传送以 - 开头的参数时,脚本仍然能够正常运行。

相关日志

  • 2011-03-24 -- linux centos 5 lamp(apache mysql php) yum自动安装shell脚本
    手头有N台linux centos 5的服务器,每次配置都要打很多命令,不想这么烦下去了。 自己写了一个自动安装脚本,包括了apache mysql php的自动Yum安装。最后还设置了防火墙。 ...
  • 2009-12-17 -- 解决PHP Warning: Cannot modify header information - headers already sent by的终极方案
    原因分析:在PHP里Cookie的使用是有一些限制的。 1、使用setcookie必须在标签之前 2、使用setcookie之前,不可以使用echo输入内容 3、直到网页被加载完后,coo...
  • 2009-12-10 -- 换行在windows和linux不同表示
    简单的说,windows换行是\r\n,十六进制数值是:0D0A。 LINUX换行是\n,十六进制数值是:0A 在linux保存的文件在windows上用记事本看的话会出现黑点 ...
  • 2008-09-17 -- 高性能网站架构-LLMP
    在网站架构设计中,大家一定对 LAMP (LinuxApacheMysqlPhp) 不陌生。 LAMP确实是一个非常优秀的架构,秉承着自由,开放,高效,易用的设计理念。 但是,本文不打算探讨LAM...
  • 2012-01-14 -- 关于apache下网站加速利器mod-pagespeed
    自从有了自己独立服务器,一直认为自己网站速度还是挺快的,但自从上了监控宝之后,发现其实自己服务器的服务经常断。有很多时候网站是不可用的,这个让我很郁闷。一直在看dbanotes(大冯)的博客,知道他的...
  • 2011-12-31 -- php中json编码和解码的一些提示
    对于php下的web service应用,json因其快速,轻量在小数据量传输的时候非常有优势,但用的时候有些小细节需要注意。我就是把数组存进去,再取出来的时候发现变成对象了,才发现原来是这样。 在...

技术研究 关键字(Tags): , , ,

如果你觉得这篇文章不错,你可以 给我留个回复订阅它。无论如何,谢谢你的支持!

评论

还没有评论。

发表评论

(必填)

(必填)