您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“php的cli概念是什么及怎么使用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在php中,cli全稱“Command Line Interface”,意思為“命令行接口”,是一種命令行運(yùn)行模式,主要用作PHP的開發(fā)外殼應(yīng)用,也就是用PHP來進(jìn)行shell腳本的開發(fā)。
本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版、DELL G3電腦
在php中,cli全稱“Command Line Interface”,意思為“命令行接口”,是一種命令行運(yùn)行模式。
在做開發(fā)的時(shí)候,我們不僅僅只是做各種網(wǎng)站或者接口,也經(jīng)常需要寫一些命令行腳本用來處理一些后端的事務(wù)。比如對數(shù)據(jù)進(jìn)行處理統(tǒng)計(jì)等。當(dāng)然也是為了效率著想,當(dāng)一個(gè)事務(wù)有可能會有較長的耗時(shí)時(shí),往往會交由服務(wù)器的定時(shí)器來固定時(shí)間調(diào)用腳本進(jìn)行處理,從而讓客戶端能夠有更好的用戶體驗(yàn)。我們今天就來了解下 PHP 的命令行運(yùn)行模式,也就是 PHP CLI 。
CLI 與 CGI
首先來看一下 CLI 和 CGI 的區(qū)別。我們都知道,Nginx 使用的是 FastCgi 來調(diào)用 PHP 的服務(wù)。CGI 是通用編程接口,也就是給調(diào)用者提供的一種使用本程序的接口。Nginx 這種類型的服務(wù)器并不是直接運(yùn)行 PHP 程序的,而是通過 FastCgi 來執(zhí)行 PHP 程序并獲得返回結(jié)果。
CLI 則是 Command Line Interface,即命令行接口。主要用作 PHP 的開發(fā)外殼應(yīng)用。也就是用 PHP 來進(jìn)行 shell 腳本的開發(fā)。相比 linux 原生的 shell 來說,當(dāng)然是方便了許多。在命令行狀態(tài)下,直接使用 php 命令就可以運(yùn)行某段 PHP 代碼或某個(gè) PHP 文件了。
另外,我們在命令行也可以直接使用 phpcgi 來運(yùn)行一段 PHP 代碼或者某個(gè) PHP 文件,它和直接使用 php 命令來運(yùn)行有什么區(qū)別呢?
CLI 的輸出沒有任何頭信息
CLI 在運(yùn)行時(shí),不會把工作目錄改為腳本的當(dāng)前目錄
CLI 出錯(cuò)時(shí)輸出純文本的錯(cuò)誤信息(非 HTML 格式)
強(qiáng)制覆蓋了 php.ini 中的某些設(shè)置,因?yàn)檫@些設(shè)置在外殼環(huán)境下是沒有意義的
// 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
我們選取最典型的一個(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 代碼
在做一些簡單的調(diào)試的時(shí)候,我們可以直接通過 CLI 來運(yùn)行一段代碼。
// php -r "echo 121;" // 121
也就是簡單的加個(gè) -r 參數(shù),后面跟上一段代碼,這段代碼必須用引號括起來。而且這個(gè)引號更推薦使用單引號,后面的例子會展示為什么用單引號更好。
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 // )
在測試文件中,我們打印了 \$argv 變量。PHP 腳本運(yùn)行的時(shí)候,會將命令行的所有參數(shù)保存在 $argv 變量中,并且還有一個(gè) $argc 變量會保存參數(shù)的個(gè)數(shù)。
我們依然是使用 php-cgi 和 php ,兩種模式來測試,從這里我們能發(fā)現(xiàn) php-cgi 模式中 $argv 打印的內(nèi)容竟然是頭信息,而不是具體的參數(shù)信息。這也沒錯(cuò),畢竟 CGI 模式本來就是為 Web 服務(wù)器提供的接口,所以它接收的是 post 、 get 這類的參數(shù)而不是命令行的參數(shù)。
CLI 模式下我們正常獲得了參數(shù)內(nèi)容,并且 $argv[0] 始終保存的是當(dāng)前運(yùn)行文件及路徑。
CLI 命令行實(shí)用選項(xiàng)
最后,我們再介紹一些命令行中常用的選項(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 // 雙引號 ",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" // }
第一段代碼在對雙引號運(yùn)行的 CLI 代碼進(jìn)行參數(shù)傳遞的時(shí)候,會直接報(bào)警告。其實(shí)很好理解,雙引號里面的$會讓系統(tǒng)的 sh/bash 以為這是個(gè)變量從而進(jìn)行變量參數(shù)替換。所以更推薦使用單引號進(jìn)行日常的簡單測試。
第二段代碼能夠正常打印傳遞進(jìn)來的參數(shù)內(nèi)容。第三行代碼則是需要傳遞帶 - 符號的內(nèi)容時(shí),需要先給一個(gè) -- 參數(shù)列表分隔符。這是因?yàn)?-xxx 的內(nèi)容會讓 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 就會以交互式地形式運(yùn)行,我們可以直接在交互狀態(tài)下寫代碼或運(yùn)行任何內(nèi)容。
查看 phpinfo() 及已經(jīng)安裝的模塊
這兩個(gè)應(yīng)該是大家經(jīng)常會使用的兩個(gè)選項(xiàng)。
// 輸出 phpinfo() // php -i // 輸出 PHP 中加載的模塊 // php -m // 查看模塊詳細(xì)信息 // php --ri swoole
另外我們還可以通過 --ri 模塊名 這個(gè)命令來查看具體某個(gè)擴(kuò)展模塊的詳細(xì)信息。比如這里我們可以查看到 swoole 擴(kuò)展的版本及相關(guān)的配置信息。
查看某個(gè)文件
// 顯示去除了注釋和多余空白的源代碼 // php -w dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php // <?php // echo getcwd(); print_r($argv); // 通過 linux 管道讀取輸入 // cat dev-blog/php/202004/source/PHP的CLI命令行運(yùn)行模式淺析.php | php -r "print file_get_contents('php://stdin');" // ......這個(gè)文件里面所有的內(nèi)容
最后兩個(gè)小技巧,一個(gè)是通過 -w 選項(xiàng),我們可以打印這個(gè) php 文件中所有非注釋和換行的內(nèi)容??梢钥闯墒窍袂岸说拇a壓縮一樣的能力。我們這個(gè)測試文件中有非常多的注釋,通過這個(gè)命令后我們打印出來的內(nèi)容是去除掉所有注釋和空白行的結(jié)果。
另一個(gè)是我們可以用 linux 管道的方式向 PHP CLI 發(fā)送數(shù)據(jù)。這里我們通過 cat 查看我們的測試文件然后通過管道發(fā)送給 PHP CLI,在腳本中使用 STDIN 來讀取管道發(fā)送過來的內(nèi)容完成了整個(gè)文件內(nèi)容的打印。這里我們沒進(jìn)行任何過濾,所以打印的是整個(gè)文件里面的內(nèi)容,大家可以運(yùn)行這個(gè)命令來測試。
“php的cli概念是什么及怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。