总结PHP权威指南 - PHP Shell脚本编程

以下总结,参照了 PHP权威指南和PHP手册:

从PHP3.0就可以编写shell脚本,使用的是CGI版本的PHP。CLI是4.2.0发布的,2者都可以编写shell脚本。先明白这2个概念,都是SAPI(Server Application Programming Interface)。


以下摘自PHP手册:

一、无论是Linux还是Windows,安装PHP,CLI和CGI都会被安装。

1.linux下安装

1>在默认情况下,当运行 make 时,CGI 和 CLI 都会被编译并且分别放置在 PHP 源文件目录的 sapi/cgi/phpsapi/cli/php 下。可以注意到两个文件都被命名为了 php

2>在 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参数.

2.windows下安装

1>在 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。在 PHP 5 中,CLI 存在于主文件夹中,名为 php.exe,而 CGI 版本名为 php-cgi.exe

可以看出,CLI基本已替代了CGI

二、如何得知自己使用的是哪个 SAPI?

1>.在 命令行下,运行 php -v 便能得知该 php 是 CGI 还是 CLI。请参考函数 php_sapi_name() 以及常量 PHP_SAPI
2>在浏览器中,输出 php_sapi_name() 以及常量 PHP_SAPI,得到的是 apache2handler(我使用的是apache,更好的是fast-cgi等,对这些概念也是模模糊糊)

三、CLI如何区别于CGI

CLI版本的PHP与CGI版本是非常类似的,而且曾基于CGI。主要区别在于所有的web服务器接口,这也是CGI真正需要实现的。
通过CLI,PHP被简化为非常基础的部分,而不会导入任何GET,POST形式的变量,在输出中不会输出任何MIME头信息,总体来说就是不会像其他SAPI执行所做的幕后工作。
1.CLI,其输出没有任何头信息。CGI倒是也提供了取消HTTP头信息的方法,CLI压根就没有这个选项,不会出现开启。CLI默认以安静模式开始,为了保证兼容CGI,保留了 -q和 --no-header 参数,这个参数用户CLI没有任何作用。
2.CLI在运行时,不会把工作目录改为脚本的当前目录,而CGI会改变。同样的CGI通过 -C 和 --no-chdir 参数,也可设置为不改变工作目录。CLI同样保留了这个参数,兼容CGI。
3.出错时,输出纯文本的错误信息,而非HTML格式 - 在shell中看不到效果,而且杂乱,没有任何意义!
4.CLI强制覆盖了php.ini的某些配置:
html_errors  - 设置为false,错误信息不显示html标签
implicit_flush - 设置为true,命令行模式下,所有来自print和echo的输出将被立即写到输出端,而不作任何的缓冲操作。如果希望延迟或控制输出,我们可以通过output buffering(输出控制,ob_flush)控制。
max_execution_time - 设置为0,不限制最大执行时间!区别于浏览器设置的最大执行时间。
register_argc_argv - 设置为true,在CLI中,总是可以访问到argc(传送给应用程序参数的个数)和argv(实际参数数组)。CGI版本或其他版本的SAPI,这2个变量基于 register_globals = on。不过到是也可以通过$_SERVER或$HTTP_SERVER_VARS超全局数组来访问。例如:$_SERVER['argv']。

Note:
在CLI模式下,我们无法通过php.ini中来修改这些选项的值,这些默认值只允许在所有的设置文件被解析后才能改变。所有修改php.ini是没有意义的。可以在程序运行的过程中改变。使用ini_set()或其他方法。

5.php.ini 名称和位置
在linux系统中,PHP(除了CLI)默认在/usr/local/lib/下寻找php.ini文件,为了更shell化,CLI后台默认寻找/etc/php-cli.ini用作替代。这可以让web服务器和CLI/shell脚本保持单独的php.ini文件。
可以通过 get_cfg_var("cfg_file_path")查看默认的php.ini文件
6.PHP的进程控制扩展(pcntl)只有在CLI版本中可以使用,通过它一个fork()调用只会复制PHP,而不会复制整个web服务器的进程。

7.CLI专用常量:
STDIN
STDOUT
STDERR

暂时写到这,看到内容太多。。。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值