CLI 则是 Command Line Interface,即命令行接口。
紧张用作 PHP 的开拓外壳运用。
也便是用 PHP 来进行 shell 脚本的开拓。
比较 linux 原生的 shell 来说,当然是方便了许多。
在命令行状态下,直策应用 php 命令就可以运行某段 PHP 代码或某个 PHP 文件了。

其余,我们在命令行也可以直策应用 phpcgi 来运行一段 PHP 代码或者某个 PHP 文件,它和直策应用 php 命令来运行有什么差异呢?

CLI 的输出没有任何头信息CLI 在运行时,不会把事情目录改为脚本确当前目录CLI 出错时输出纯文本的缺点信息(非 HTML 格式)逼迫覆盖了 php.ini 中的某些设置,由于这些设置在外壳环境下是没故意义的

//PHP的CLI命令走运行模式浅析.phpechogetcwd();//php-cgidev-blog/php/202004/source/PHP的CLI命令走运行模式浅析.php//...../MyDoc/博客文章/dev-blog/php/202004/source//phpdev-blog/php/202004/source/PHP的CLI命令走运行模式浅析.php//...../MyDoc/博客文章

我们选取最范例的一个例子,我们运行的这个文件中,利用 getcwd() 输出当前脚本运行的目录,可以看出两种运行办法输出的结果明显不同。
php-cgi 因此文件所在目录为基准输出,而 php 则因此当前运行这个命令的目录为基准输出。

phpcli模式PHP的CLI敕令交运行模式浅析 JavaScript

直接运行 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//Content-type: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 打印的内容竟然是头信息,而不是详细的参数信息。
这也没错,毕竟 CGI 模式本来便是为 Web 做事器供应的接口,以是它吸收的是 post 、 get 这类的参数而不是命令行的参数。

CLI 模式下我们正常得到了参数内容,并且 $argv[0] 始终保存的是当前运行文件及路径。

CLI 命令行实用选项

末了,我们再先容一些命令行中常用的选项。

-r 直接运行代码时的参数通报

//php-r"var_dump($argv);"app//Warning:var_dump()expectsatleast1parameter,0giveninCommandlinecodeonline1//双引号",sh/bash实施了参数更换//php-r'var_dump($argv);'app//array(2){//[0]=>string(19)"Standardinputcode"//[1]=>string(3)"app"//}//php-r'var_dump($argv);'---h//array(2){//[0]=>string(19)"Standardinputcode"//[1]=>string(2)"-h"//}

第一段代码在对双引号运行的 CLI 代码进行参数通报的时候,会直接报警告。
实在很好理解,双引号里面的$会让系统的 sh/bash 以为这是个变量从而进行变量参数更换。
以是更推举利用单引号进行日常的大略测试。

第二段代码能够正常打印通报进来的参数内容。
第三行代码则是须要通报带 - 符号的内容时,须要先给一个 -- 参数列表分隔符。
这是由于 -xxx 的内容会让 php 命令认为这是一个命令选项而不是参数,以是我们添加一个分隔符就可以让分隔符之后的参数内容原样通报进代码中。

交互式地运行 PHP

//php-a//php>$a=1;//php>echo$a;//php>1

添加一个 -a 选项,PHP 就会以交互式地形式运行,我们可以直接在交互状态下写代码或运行任何内容。

查看 phpinfo() 及已经安装的模块

这两个该当是大家常常会利用的两个选项。

//输出phpinfo()//php-i//输出PHP中加载的模块//php-m//查看模块详细信息//php--riswoole

其余我们还可以通过 --ri 模块名 这个命令来查看详细某个扩展模块的详细信息。
比如这里我们可以查看到 swoole 扩展的版本及干系的配置信息。

查看某个文件

//显示去除了注释和多余空缺的源代码//php-wdev-blog/php/202004/source/PHP的CLI命令走运行模式浅析.php//<?php//echogetcwd();print_r($argv);//通过linux管道读取输入//catdev-blog/php/202004/source/PHP的CLI命令走运行模式浅析.php|php-r"printfile_get_contents('php://stdin');"//......这个文件里面所有的内容

末了两个小技巧,一个是通过 -w 选项,我们可以打印这个 php 文件中所有非注释和换行的内容。
可以算作是像前真个代码压缩一样的能力。
我们这个测试文件中有非常多的注释,通过这个命令后我们打印出来的内容是去除掉所有注释和空缺行的结果。

另一个是我们可以用 linux 管道的办法向 PHP CLI 发送数据。
这里我们通过 cat 查看我们的测试文件然后通过管道发送给 PHP CLI,在脚本中利用 STDIN 来读取管道发送过来的内容完成了全体文件内容的打印。
这里我们没进行任何过滤,以是打印的是全体文件里面的内容,大家可以运行这个命令来测试。

总结

实在命令行模式运行的时候还有很多的选项,这里我们只是选取了一部分非常有用的内容进行展示。
当然,大部分框架都供应了用于命令行的脚本框架,比如 laravel 中可以通过 php artisan make:command 来创建命令行脚本,然后利用 php artisan 来运行框架中的脚本。
这些内容将来我们在学习框架方面知识的内容将会进行详细的讲解。

命令行 CLI 模式的运用非常广泛,险些任何项目中都会利用到,以是,深入的学习节制它将会使我们大受裨益。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E7%9A%84CLI%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BF%90%E8%A1%8C%E6%A8%A1%E5%BC%8F%E6%B5%85%E6%9E%90.php

参考文档:

https://www.php.net/manual/zh/features.commandline.php