中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP的CLI命令行運行模式介紹

發布時間:2021-09-03 19:39:16 來源:億速云 閱讀:129 作者:chen 欄目:大數據

本篇內容主要講解“PHP的CLI命令行運行模式介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP的CLI命令行運行模式介紹”吧!

 

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
// ...../MyDoc/博客文章
 

我們選取最典型的一個例子,我們運行的這個文件中,使用 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 來讀取管道發送過來的內容完成了整個文件內容的打印。這里我們沒進行任何過濾,所以打印的是整個文件里面的內容,大家可以運行這個命令來測試。


到此,相信大家對“PHP的CLI命令行運行模式介紹”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

汝州市| 永善县| 潼南县| 中阳县| 新邵县| 泰顺县| 忻州市| 桂林市| 商都县| 定襄县| 唐河县| 神木县| 安国市| 武城县| 东莞市| 隆子县| 宜川县| 墨江| 芷江| 都昌县| 五河县| 中山市| 定南县| 宁德市| 静乐县| 大厂| 神农架林区| 瓦房店市| 石楼县| 遵义县| 忻城县| 正阳县| 庆阳市| 泸定县| 伊金霍洛旗| 铜川市| 灵璧县| 甘孜县| 开原市| 分宜县| 西平县|