在做开发的时候,我们不仅要做各种网站或者界面,还经常需要写一些命令行脚本来处理一些后端的事务。例如,数据处理和统计。当然,为了效率,当一个事务可能需要很长时间时,往往会交给服务端的定时器定时调用脚本进行处理,这样客户端才能有更好的用户体验。今天就来了解一下PHP的命令行运行方式,也就是PHPCLI。CLI和CGI让我们先看看CLI和CGI的区别。我们都知道Nginx是使用FastCgi来调用PHP服务的。CGI是一个通用的编程接口,即提供给调用者使用这个程序的接口。Nginx这类服务器并不直接运行PHP程序,而是通过FastCgi执行PHP程序,并获取返回结果。CLI即CommandLineInterface,即命令行界面。主要用作PHP的开发shell应用程序。那就是用PHP开发shell脚本。比起linux自带的shell,当然方便多了。在命令行状态下,可以直接使用php命令来运行某段PHP代码或者某个PHP文件。另外,我们也可以直接使用phpcgi在命令行中运行一段PHP代码或者某个PHP文件。运行它和直接使用php命令有什么区别?CLI的输出没有任何标头。CLI在运行时不会将工作目录更改为脚本的当前目录。发生错误时,CLI会输出纯文本错误消息(不是HTML格式)。php.ini中的一些设置强制覆盖了php.ini中的一些设置,因为这些设置在shell环境下是没有意义的//PHP的CLI命令行运行方式简析。phpechogetcwd();//php-cgidev-blog/php/202004/source/PHP的CLI命令行运行方式Analysis.php//...../MyDoc/blogarticle/dev-blog/php/202004/source//phpdev-blog/php/202004/source/PHPCLI命令行运行方式analysis.php//...../MyDoc/blog文章我们选择最典型的例子。在我们运行的文件中,使用getcwd()输出当前脚本运行的目录。可以看出,两种运行模式的输出结果明显不同。php-cgi是基于文件所在目录,而php是基于当前运行命令的目录。直接运行PHP代码在进行一些简单的调试时,我们可以直接通过CLI运行一段代码。//php-r"echo121;"//121只是加了一个-r参数,后面是一段代码,必须用引号括起来。而这个引号更推荐使用单引号,下面的例子会说明为什么最好使用单引号。CLI获取参数在命令行模式下,也可以向脚本传递参数。//PHP的CLI命令行运行方式分析.phpprint_r($argv);//php-cgidev-blog/php/202004/source/PHP的CLI命令行运行方式分析.php123//X-Powered-By:PHP/7.3.0//内容类型:text/html;charset=UTF-8//phpdev-blog/php/202004/source/PHP的CLI命令行运行模式解析.php123//Array//(//[0]=>dev-blog/php/202004/source/PHP的CLI命令行运行模式解析.php//[1]=>1//[2]=>2//[3]=>3//)在测试文件中,我们打印了\$argv变量。PHP脚本运行时,命令行的所有参数都会保存在$argv变量中,还有一个$argc变量会保存参数个数。我们还是用php-cgi和php两种模式来测试。从这里我们可以发现,php-cgi方式下$argv打印出来的内容是header信息,并不是具体的参数信息。确实如此,毕竟CGI模式本来就是为Web服务器提供的接口,所以它接收的是post、get等参数,而不是命令行参数。在CLI模式下,我们正常获取参数内容,$argv[0]一直保存着当前运行的文件和路径。CLI命令行有用的选项最后,让我们介绍一些命令行上常用的选项。-r直接运行代码时传递的参数//php-r"var_dump($argv);"app//Warning:var_dump()expectsatleast1parameter,0inCommandlinecodeonline1//doublequotes",sh/bash实现参数替换//php-r'var_dump($argv);'app//array(2){//[0]=>string(19)"标准输入代码"//[1]=>string(3)"app"//}//php-r'var_dump($argv);'---h//array(2){//[0]=>string(19)"标准输入代码"//[1]=>string(2)"-h"//}第一段代码给双引号运行的CLI代码传递参数时会直接报警告,其实很好理解,双引号里面的$会让系统的sh/bash认为这是一个变量,执行可变参数所以日常简单测试建议使用单引号。需要先给一个--参数列表分隔符,这是因为-xxx的内容会让php命令认为这是一个命令选项而不是参数,所以我们可以加一个分隔符让参数的内容在后面分隔符按原样传递到代码中。以交互方式运行PHP//php-a//php>$a=1;//php>echo$a;//php>1添加a-a选项,PHP会交互运行,我们可以直接在交互状态下编写代码或运行任何内容。查看phpinfo()和安装的模块应该是大家经常用到的两个选项//Outputphpinfo()//php-i//输出PHP中加载的模块//php-m//查看模块详情//php--riswoole另外,我们还可以通过命令--rimodulename查看某个扩展模块的详细信息。比如这里我们可以查看swoole扩展的版本和相关的配置信息。查看文件//显示没有注释和多余空格的源代码//php-wdev-blog/php/202004/source/PHP的CLI命令行操作模式解析mode.php//
