新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)PHP中CLI命令行運(yùn)行模式的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站是專業(yè)的新巴爾虎左網(wǎng)站建設(shè)公司,新巴爾虎左接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行新巴爾虎左網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
PHP的CLI命令行運(yùn)行模式淺析
在做開發(fā)的時(shí)候,我們不僅僅只是做各種網(wǎng)站或者接口,也經(jīng)常需要寫一些命令行腳本用來(lái)處理一些后端的事務(wù)。比如對(duì)數(shù)據(jù)進(jìn)行處理統(tǒng)計(jì)等。當(dāng)然也是為了效率著想,當(dāng)一個(gè)事務(wù)有可能會(huì)有較長(zhǎng)的耗時(shí)時(shí),往往會(huì)交由服務(wù)器的定時(shí)器來(lái)固定時(shí)間調(diào)用腳本進(jìn)行處理,從而讓客戶端能夠有更好的用戶體驗(yàn)。我們今天就來(lái)了解下 PHP 的命令行運(yùn)行模式,也就是 PHP CLI 。
CLI 與 CGI
首先來(lái)看一下 CLI 和 CGI 的區(qū)別。我們都知道,Nginx 使用的是 FastCgi 來(lái)調(diào)用 PHP 的服務(wù)。 CGI 是通用編程接口,也就是給調(diào)用者提供的一種使用本程序的接口。 Nginx 這種類型的服務(wù)器并不是直接運(yùn)行 PHP 程序的,而是通過(guò) FastCgi 來(lái)執(zhí)行 PHP 程序并獲得返回結(jié)果。
CLI 則是 Command Line Interface,即命令行接口。主要用作 PHP 的開發(fā)外殼應(yīng)用。也就是用 PHP 來(lái)進(jìn)行 shell 腳本的開發(fā)。相比 linux 原生的 shell 來(lái)說(shuō),當(dāng)然是方便了許多。在命令行狀態(tài)下,直接使用 php 命令就可以運(yùn)行某段 PHP 代碼或某個(gè) PHP 文件了。
另外,我們?cè)诿钚幸部梢灾苯邮褂?phpcgi 來(lái)運(yùn)行一段 PHP 代碼或者某個(gè) PHP 文件,它和直接使用 php 命令來(lái)運(yùn)行有什么區(qū)別呢?
CLI 的輸出沒(méi)有任何頭信息
CLI 在運(yùn)行時(shí),不會(huì)把工作目錄改為腳本的當(dāng)前目錄
CLI 出錯(cuò)時(shí)輸出純文本的錯(cuò)誤信息(非 HTML 格式)
強(qiáng)制覆蓋了 php.ini 中的某些設(shè)置,因?yàn)檫@些設(shè)置在外殼環(huán)境下是沒(méi)有意義的
// PHP的CLI命令行運(yùn)行模式淺析.php echo getcwd(); // php-cgi dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php // ...../MyDoc/博客文章/dev-blog/php/202004/source // php dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php // ...../MyDoc/博客文章
我們選取最典型的一個(gè)例子,我們運(yùn)行的這個(gè)文件中,使用 getcwd() 輸出當(dāng)前腳本運(yùn)行的目錄,可以看出兩種運(yùn)行方式輸出的結(jié)果明顯不同。php-cgi 是以文件所在目錄為基準(zhǔn)輸出,而 php 則是以當(dāng)前運(yùn)行這個(gè)命令的目錄為基準(zhǔn)輸出。
直接運(yùn)行 PHP 代碼
在做一些簡(jiǎn)單的調(diào)試的時(shí)候,我們可以直接通過(guò) CLI 來(lái)運(yùn)行一段代碼。
// php -r "echo 121;" // 121
也就是簡(jiǎn)單的加個(gè) -r 參數(shù),后面跟上一段代碼,這段代碼必須用引號(hào)括起來(lái)。而且這個(gè)引號(hào)更推薦使用單引號(hào),后面的例子會(huì)展示為什么用單引號(hào)更好。
CLI 獲取參數(shù)
命令行模式下也是可以給腳本傳遞參數(shù)的。
// PHP的CLI命令行運(yùn)行模式淺析.php print_r($argv); // php-cgi dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php 1 2 3 // X-Powered-By: PHP/7.3.0 // Content-type: text/html; charset=UTF-8 // php dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php 1 2 3 // Array // ( // [0] => dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php // [1] => 1 // [2] => 2 // [3] => 3 // )
在測(cè)試文件中,我們打印了 \$argv 變量。PHP 腳本運(yùn)行的時(shí)候,會(huì)將命令行的所有參數(shù)保存在 $argv 變量中,并且還有一個(gè) $argc 變量會(huì)保存參數(shù)的個(gè)數(shù)。
我們依然是使用 php-cgi 和 php ,兩種模式來(lái)測(cè)試,從這里我們能發(fā)現(xiàn) php-cgi 模式中 $argv 打印的內(nèi)容竟然是頭信息,而不是具體的參數(shù)信息。這也沒(méi)錯(cuò),畢竟 CGI 模式本來(lái)就是為 Web 服務(wù)器提供的接口,所以它接收的是 post 、 get 這類的參數(shù)而不是命令行的參數(shù)。
CLI 模式下我們正常獲得了參數(shù)內(nèi)容,并且 $argv[0] 始終保存的是當(dāng)前運(yùn)行文件及路徑。
CLI 命令行實(shí)用選項(xiàng)
最后,我們?cè)俳榻B一些命令行中常用的選項(xiàng)。
-r 直接運(yùn)行代碼時(shí)的參數(shù)傳遞
// php -r "var_dump($argv);" app // Warning: var_dump() expects at least 1 parameter, 0 given in Command line code on line 1 // 雙引號(hào) ",sh/bash 實(shí)行了參數(shù)替換 // php -r 'var_dump($argv);' app // array(2) { // [0]=>string(19) "Standard input code" // [1]=>string(3) "app" // } // php -r 'var_dump($argv);' -- -h // array(2) { // [0]=>string(19) "Standard input code" // [1]=>string(2) "-h" // }
第一段代碼在對(duì)雙引號(hào)運(yùn)行的 CLI 代碼進(jìn)行參數(shù)傳遞的時(shí)候,會(huì)直接報(bào)警告。其實(shí)很好理解,雙引號(hào)里面的$會(huì)讓系統(tǒng)的 sh/bash 以為這是個(gè)變量從而進(jìn)行變量參數(shù)替換。所以更推薦使用單引號(hào)進(jìn)行日常的簡(jiǎn)單測(cè)試。
第二段代碼能夠正常打印傳遞進(jìn)來(lái)的參數(shù)內(nèi)容。第三行代碼則是需要傳遞帶 - 符號(hào)的內(nèi)容時(shí),需要先給一個(gè) -- 參數(shù)列表分隔符。這是因?yàn)?-xxx 的內(nèi)容會(huì)讓 php 命令認(rèn)為這是一個(gè)命令選項(xiàng)而不是參數(shù),所以我們添加一個(gè)分隔符就可以讓分隔符之后的參數(shù)內(nèi)容原樣傳遞進(jìn)代碼中。
交互式地運(yùn)行 PHP
// php -a // php > $a = 1; // php > echo $a; // php > 1
添加一個(gè) -a 選項(xiàng),PHP 就會(huì)以交互式地形式運(yùn)行,我們可以直接在交互狀態(tài)下寫代碼或運(yùn)行任何內(nèi)容。
查看 phpinfo() 及已經(jīng)安裝的模塊
這兩個(gè)應(yīng)該是大家經(jīng)常會(huì)使用的兩個(gè)選項(xiàng)。
// 輸出 phpinfo() // php -i // 輸出 PHP 中加載的模塊 // php -m // 查看模塊詳細(xì)信息 // php --ri swoole
另外我們還可以通過(guò) --ri 模塊名 這個(gè)命令來(lái)查看具體某個(gè)擴(kuò)展模塊的詳細(xì)信息。比如這里我們可以查看到 swoole 擴(kuò)展的版本及相關(guān)的配置信息。
查看某個(gè)文件
// 顯示去除了注釋和多余空白的源代碼 // php -w dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php //最后兩個(gè)小技巧,一個(gè)是通過(guò) -w 選項(xiàng),我們可以打印這個(gè) php 文件中所有非注釋和換行的內(nèi)容。可以看成是像前端的代碼壓縮一樣的能力。我們這個(gè)測(cè)試文件中有非常多的注釋,通過(guò)這個(gè)命令后我們打印出來(lái)的內(nèi)容是去除掉所有注釋和空白行的結(jié)果。
另一個(gè)是我們可以用 linux 管道的方式向 PHP CLI 發(fā)送數(shù)據(jù)。這里我們通過(guò) cat 查看我們的測(cè)試文件然后通過(guò)管道發(fā)送給 PHP CLI,在腳本中使用 STDIN 來(lái)讀取管道發(fā)送過(guò)來(lái)的內(nèi)容完成了整個(gè)文件內(nèi)容的打印。這里我們沒(méi)進(jìn)行任何過(guò)濾,所以打印的是整個(gè)文件里面的內(nèi)容,大家可以運(yùn)行這個(gè)命令來(lái)測(cè)試。
總結(jié)
其實(shí)命令行模式運(yùn)行的時(shí)候還有很多的選項(xiàng),這里我們只是選取了一部分非常有用的內(nèi)容進(jìn)行展示。當(dāng)然,大部分框架都提供了用于命令行的腳本框架,比如 laravel 中可以通過(guò) php artisan make:command 來(lái)創(chuàng)建命令行腳本,然后使用 php artisan 來(lái)運(yùn)行框架中的腳本。這些內(nèi)容將來(lái)我們?cè)趯W(xué)習(xí)框架方面知識(shí)的內(nèi)容將會(huì)進(jìn)行詳細(xì)的講解。
命令行 CLI 模式的應(yīng)用非常廣泛,幾乎任何項(xiàng)目中都會(huì)使用到,所以,深入的學(xué)習(xí)掌握它將會(huì)使我們大受裨益。
測(cè)試代碼:
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關(guān)于“PHP中CLI命令行運(yùn)行模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
網(wǎng)站題目:PHP中CLI命令行運(yùn)行模式的示例分析
標(biāo)題來(lái)源:http://www.ef60e0e.cn/article/pdechj.html