美文网首页
【转】PHP SAPI---CLI

【转】PHP SAPI---CLI

作者: yancolin | 来源:发表于2017-12-13 14:18 被阅读54次

    http://blog.csdn.net/shupan001/article/details/7176210
    从版本 4.3.0 开始,PHP 提供了一种新类型的 SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。顾名思义,该 SAPI模块主要用作 PHP 的开发外壳应用。CLI SAPI 和其它 SAPI 模块相比有很多的不同之处,我们将在本章中详细阐述。值得一提的是,CLI 和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行为。
    CLI SAPI 最先是随 PHP 4.2.0 版本发布的,但仍旧只是一个实验性的版本,并需要在运行 ./configure 时加上 --enable-cli 参数。从 PHP 4.3.0 版本开始,CLI SAPI 成为了正式模块,--enable-cli 参数会被默认得设置为 on,您也可以用参数 --disable-cli 来屏蔽。
    从 PHP 4.3.0开始,CLI/CGI 二进制执行文件的文件名、位置和是否存在会根据 PHP 在您系统上的安装而不同。在默认情况下,当运行 make 时,CGI 和 CLI 都会被编译并且分别放置在您 PHP 源文件目录的sapi/cgi/php 和 sapi/cli/php 下。您可以注意到两个文件都被命名为了 php。在 make install 的过程中会发生什么取决于您的配置行。如果在配置的时候选择了一个 SAPI 模块,如 apxs,或者使用了 --disable-cgi参数,则在 make install 的过程中,CLI 将被拷贝到 {PREFIX}/bin/php,除非 CGI 已经被放置在了那个位置。因此,例如,如果在您的配置行中有 --with--apxs ,则在 make install 的过程中,CLI 将被拷贝到{PREFIX}/bin/php。如果您希望撤销 CGI 执行文件的安装,请在 make install 之后运行 make install-cli。或者,您也可以在您的配置行中加上 --disable-cgi 参数。

    注: 由于 --enable-cli 和 --enable-cgi 同时默认有效,因此,您不必再配置行中加上 --enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php。

    在 PHP 4.2.0 到 PHP 4.2.3 之间的 Windows 发行包中,CLI 的文件名为 php-cli.exe,相同文件夹下的php.exe 为 CGI。从 PHP 4.3.0 版本开始,Windows 的发行包中 CLI 的执行文件为 php.exe,被放置在一个单独的名为 cli 的文件夹下,即 cli/php.exe。

    **这是哪个 SAPI?: **
    在命令外壳下,运行 php -v便能得知该 php是 CGI 还是 CLI。请参考函数
    php_sapi_name()以及常量 PHP_SAPI

    注: 在 PHP 4.3.2 中加入了 UNIX 的 man 页面。可以在你的命令外壳下键入 man php 来查看。
    以下为 CLI SAPI 和其它 SAPI 模块相比的显著区别:

    • 与 CGI SAPI 不同,其输出没有任何头信息。
      尽管 CGI SAPI 提供了取消 HTTP 头信息的方法,但在 CLI SAPI 中并不存在类似的方法以开启 HTTP 头信息的输出。
    • CLI 默认以安静模式开始,但为了保证兼容性, -q 参数使得您可以使用旧的 CGI 脚本。
      在运行时,不会把工作目录改为脚本的当前目录。(您可以使用 -C 参数来兼容 CGI 模式)。
      出错时输出纯文本的错误信息(非 HTML 格式)。
      CLI SAPI 强制更改了 php.ini 中的某些设置,因为这些设置在外壳环境下是没有意义的。

    注: 这些设置无法在设置文件 php.ini 或任何指定的其它文件中被初始化为其它值。这些默认值被限制在所有其它的设置文件被解析后改变。不过,它们的值可以在程序运行的过程中被改变(尽管对于该运行过程来说,这些设置项是没有意义的)。


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

    Usage: php [options] [-f] <file> [args...] php [options] -r <code> [args...] php [options] [-- args...] -s Display colour syntax highlighted source. -w Display source with stripped comments and whitespace. -f <file> Parse <file>. -v Version number -c <path>|<file> 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 <file> Load Zend extension <file>. -l Syntax check only (lint) -m Show compiled in modules -i PHP information -r <code> Run PHP <code> 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

    CLI SAPI 模块有以下三种不同的方法来获取您要运行的 PHP 代码:

    以上三种运行代码的方法不能同时使用。
    和所有的外壳应用程序一样,PHP 的二进制文件(php.exe 文件)及其运行的 PHP 脚本能够接受一系列的参数。PHP 没有限制传送给脚本程序的参数的个数(外壳程序对命令行的字符数有限制,但您通常都不会超过该限制)。传递给您脚本的参数可在全局变量 $argv 中获取。该数组中下标为零的成员为脚本的名称(当 PHP代码来自标准输入获直接用 -r 参数以命令行方式运行时,该名称为“-”)。另外,全局变量 $argc 存有$argv 数组中成员变量的个数(而非传送给脚本程序的参数的个数)。
    只要您传送给您脚本的参数不是以 - 符号开头,您就无需过多的注意什么。向您的脚本传送以 - 开头的参数会导致错误,因为 PHP 会认为应该由它自身来处理这些参数。您可以用参数列表分隔符 -- 来解决这个问题。在PHP 解析完参数后,该符号后所有的参数将会被原样传送给您的脚本程序。

    以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明: $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明: $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" }

    除此之外,我们还有另一个方法将 PHP 用于外壳脚本。您可以在写一个脚本,并在第一行以 #!/usr/bin/php开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。

    <?php
    var_dump($argv);
    ?>

    假设改文件名为 test 并被放置在当前目录下,我们可以做如下操作:

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

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



    PHP 的命令行模式能使得 PHP 脚本能完全独立于 WEB 服务器单独运行。如果您使用 Unix 系统,您需要在您的 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用什么样的程序要运行该脚本。在 Windows 平台下您可以将 <var style="box-sizing: border-box;">php.exe</var> 和 <var style="box-sizing: border-box;">.php</var> 文件的双击属性相关联,您也可以编写一个批处理文件来用 PHP 执行脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此您也可以用该方法编写跨平台的脚本程序。以下是一个简单的PHP 命令行程序的范例。

    例子 25-1. 试图以命令行方式运行的 PHP 脚本(script.php)

    在以上脚本中,我们用第一行特殊的代码来指明该文件应该由 PHP 来执行。我们在这里使用 CLI 的版本,因此不会有 HTTP 头信息输出。在您用 PHP 编写命令行应用程序时,您可以使用两个参数:$argc 和$argv。前面一个的值是比参数个数大 1 的整数(运行的脚本本身的名称也被当作一个参数)。第二个时包含有参数的数组,其第一个元素为脚本的名称,下标为数字 0($argv[0])。

    在以上程序中我们检查了参数的个数是大于 1 个还是小于 1 个。即时参数是--help、-help、-h 或 -?,我们仍然打印出帮助信息,并同时动态输出脚本的名称。如果还收到了其它参数,我们也把它们显示出来。

    如果您希望在 Unix 下运行以上脚本,您需要使得它成为可执行脚本,然后简单的运行 script.php echothis或 script.php -h。在 Windows 下,您可以为此编写一个批处理文件:

    例子 25-2. 运行 PHP 命令行脚本的批处理文件(script.bat)
    @c:"php"cli"php.exe script.php %1 %2 %3 %4

    假设您将上述程序命名为 script.php,且您的 CLI php.exe 文件放置在 c:"php"cli"php.exe,该批处理文件会帮助您将附加的参数传给脚本程序: script.bat echothis 或 script.bat -h。

    请参阅 Readline 扩展模块的有关文档,以获取更多的函数的信息。这些函数可以帮助您完善您的 PHP 命令行应用程序。

    相关文章

      网友评论

          本文标题:【转】PHP SAPI---CLI

          本文链接:https://www.haomeiwen.com/subject/eoiaixtx.html