php cli是什麼意思

2022-02-28 19:01:00

在php中,cli全稱「Command Line Interface」,意思為「命令列介面」,是一種命令列執行模式,主要用作PHP的開發外殼應用,也就是用PHP來進行shell指令碼的開發。

本教學操作環境:windows7系統、PHP7.1版、DELL G3電腦

在php中,cli全稱「Command Line Interface」,意思為「命令列介面」,是一種命令列執行模式。

PHP的CLI命令列執行模式淺析

在做開發的時候,我們不僅僅只是做各種網站或者介面,也經常需要寫一些命令列指令碼用來處理一些後端的事務。比如對資料進行處理統計等。當然也是為了效率著想,當一個事務有可能會有較長的耗時時,往往會交由伺服器的定時器來固定時間呼叫指令碼進行處理,從而讓使用者端能夠有更好的使用者體驗。我們今天就來了解下 PHP 的命令列執行模式,也就是 PHP CLI 。

CLI 與 CGI

首先來看一下 CLI 和 CGI 的區別。我們都知道,Nginx 使用的是 FastCgi 來呼叫 PHP 的服務。CGI 是通用程式設計介面,也就是給呼叫者提供的一種使用本程式的介面。Nginx 這種型別的伺服器並不是直接執行 PHP 程式的,而是通過 FastCgi 來執行 PHP 程式並獲得返回結果。

CLI 則是 Command Line Interface,即命令列介面。主要用作 PHP 的開發外殼應用。也就是用 PHP 來進行 shell 指令碼的開發。相比 linux 原生的 shell 來說,當然是方便了許多。在命令列狀態下,直接使用 php 命令就可以執行某段 PHP 程式碼或某個 PHP 檔案了。

另外,我們在命令列也可以直接使用 phpcgi 來執行一段 PHP 程式碼或者某個 PHP 檔案,它和直接使用 php 命令來執行有什麼區別呢?

  • CLI 的輸出沒有任何頭資訊

  • CLI 在執行時,不會把工作目錄改為指令碼的當前目錄

  • CLI 出錯時輸出純文字的錯誤資訊(非 HTML 格式)

強制覆蓋了 php.ini 中的某些設定,因為這些設定在外殼環境下是沒有意義的

// PHP的CLI命令列執行模式淺析.php
echo getcwd();

//  php-cgi dev-blog/php/202004/source/PHP的CLI命令列執行模式淺析.php
// ...../MyDoc/部落格文章/dev-blog/php/202004/source

// php dev-blog/php/202004/source/PHP的CLI命令列執行模式淺析.php

我們選取最典型的一個例子,我們執行的這個檔案中,使用 getcwd() 輸出當前指令碼執行的目錄,可以看出兩種執行方式輸出的結果明顯不同。php-cgi 是以檔案所在目錄為基準輸出,而 php 則是以當前執行這個命令的目錄為基準輸出。

直接執行 PHP 程式碼

在做一些簡單的偵錯的時候,我們可以直接通過 CLI 來執行一段程式碼。

// php -r "echo 121;"
// 121

也就是簡單的加個 -r 引數,後面跟上一段程式碼,這段程式碼必須用引號括起來。而且這個引號更推薦使用單引號,後面的例子會展示為什麼用單引號更好。

CLI 獲取引數

命令列模式下也是可以給指令碼傳遞引數的。

// PHP的CLI命令列執行模式淺析.php
print_r($argv);
// php-cgi dev-blog/php/202004/source/PHP的CLI命令列執行模式淺析.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命令列執行模式淺析.php 1 2 3
// 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() expects at least 1 parameter, 0 given in Command line code on line 1
// 雙引號 ",sh/bash 實行了引數替換

// 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"
// }

第一段程式碼在對雙引號執行的 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 --ri swoole

另外我們還可以通過 --ri 模組名 這個命令來檢視具體某個擴充套件模組的詳細資訊。比如這裡我們可以檢視到 swoole 擴充套件的版本及相關的設定資訊。

檢視某個檔案

// 顯示去除了註釋和多餘空白的原始碼
// php -w dev-blog/php/202004/source/PHP的CLI命令列執行模式淺析.php
// <?php
//  echo getcwd(); print_r($argv);
// 通過 linux 管道讀取輸入
// cat dev-blog/php/202004/source/PHP的CLI命令列執行模式淺析.php | php -r "print file_get_contents('php://stdin');"
// ......這個檔案裡面所有的內容

最後兩個小技巧,一個是通過 -w 選項,我們可以列印這個 php 檔案中所有非註釋和換行的內容。可以看成是像前端的程式碼壓縮一樣的能力。我們這個測試檔案中有非常多的註釋,通過這個命令後我們列印出來的內容是去除掉所有註釋和空白行的結果。

另一個是我們可以用 linux 管道的方式向 PHP CLI 傳送資料。這裡我們通過 cat 檢視我們的測試檔案然後通過管道傳送給 PHP CLI,在指令碼中使用 STDIN 來讀取管道傳送過來的內容完成了整個檔案內容的列印。這裡我們沒進行任何過濾,所以列印的是整個檔案裡面的內容,大家可以執行這個命令來測試。

總結

其實命令列模式執行的時候還有很多的選項,這裡我們只是選取了一部分非常有用的內容進行展示。當然,大部分框架都提供了用於命令列的指令碼框架,比如 laravel 中可以通過 php artisan make:command 來建立命令列指令碼,然後使用 php artisan 來執行框架中的指令碼。這些內容將來我們在學習框架方面知識的內容將會進行詳細的講解。

命令列 CLI 模式的應用非常廣泛,幾乎任何專案中都會使用到,所以,深入的學習掌握它將會使我們大受裨益。

推薦學習:《》

以上就是php cli是什麼意思的詳細內容,更多請關注TW511.COM其它相關文章!