如何獲取PHP命令行參數(shù)使用 PHP 開發(fā)的同學多少都會接觸過 CLI 命令行。經(jīng)常會有一些定時任務或者一些腳本直接使用命令行處理會更加的方便,有些時候我們會需要像網(wǎng)頁的 GET 、 POST 一樣為這些命令行腳本提供參數(shù)。比如在針對某些日期做統(tǒng)計的腳本,就需要傳遞一個日期給它,這樣我們就統(tǒng)計指定日期的一些數(shù)據(jù)。這類需求應該非常常見,那么,我們都是如何來接收這些命令行的參數(shù)的呢?今天,就來介紹一下這方面的內(nèi)容。 $argv 獲得所有空格分隔的參數(shù)列表這個變量估計是大家用得比較多的一個接參變量了。它是 PHP 為我們準備好的一個固定變量,目的就是獲取傳遞給腳本的參數(shù)數(shù)組。 print_r($argv); 這個數(shù)組是以參數(shù)間隔的空格進行分隔的。第1個元素是當前運行的腳本文件名,也就是說,不管有沒有參數(shù),這個變量一定會有一個 $argv[0] 表示的是當前的腳本文件名。 在日常的開發(fā)需求中,其實使用這個變量就已經(jīng)夠用了。但是這明顯不會是我們今天的主題,大家注意到上面的代碼中我們有很多參數(shù)是 -x=xxx 的形式,這種形式的參數(shù)是不是和 Linux 的命令選項非常像,沒錯,這就是我們今天要重點介紹的:從命令行參數(shù)列表中獲取選項。 getopt() 從命令行參數(shù)列表中獲取選項其實就是這樣一個簡單的函數(shù),我們就可以像 Linux 的命令選項一樣獲取指定的命令值。而且不是像 $argv 按空格進行分隔,命令選項函數(shù)會將這些命令選項封裝成數(shù)組,組成以選項名為鍵,以等號后面的內(nèi)容為值的數(shù)組,更加方便我們的使用。 // php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd 是不是很神奇,而且非常直觀吧,我們直接就拿到了 b 、 c 、d 的內(nèi)容并且是格式非常清晰的鍵值數(shù)組形式。有同學要問了,a 和 e 呢?還有后面的 ccc 、 ddd 呢? 首先要說明的是,ccc 和 ddd 不是標準的選項參數(shù),也就是說,這個函數(shù)接收的內(nèi)容是以 - 開頭的選項,所以 ccc 和 ddd 不會在這里輸出,并且需要注意的是,非選項參數(shù)會中斷選項參數(shù)的獲取,在 ccc 之后如果繼續(xù)添加 - 開頭的選項也是無法獲取到的,這個我們后面還會看到。而 -- 開頭的選項參數(shù)呢?我們直接看下面的長選項功能。 長選項// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd 沒錯,getopt() 函數(shù)的第二個參數(shù)就是定義這種 -- 開頭的長選項的,而且需要注意的是,第一個參數(shù)是字符串類型,第二個長選項參數(shù)是數(shù)組類型的。那么我們把它們結合起來,就當然可以獲取到全部的參數(shù)信息啦! // php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd OK,參數(shù)選項獲取沒問題了吧,細心的同學肯定又發(fā)現(xiàn)了一個問題,這個 getopt() 函數(shù)的參數(shù)中定義的選項名稱后面為啥都要加個冒號?這就涉及到我們的冒號規(guī)則了,請直接往下看。 冒號規(guī)則getopt() 的前兩個參數(shù)都支持一套關于選項獲取的規(guī)則:
我們還是直接通過代碼來看一下。 // 一 這一段比較長,我們一塊一塊來看。首先是不帶冒號的 abcdef 寫法,返回的數(shù)組中都包含鍵,但沒有值,對應上面的規(guī)則就是不接受這些參數(shù)選項的值,你傳了這些參數(shù)選項也是只有鍵名而內(nèi)容是空的。 第二段是定義了一個參數(shù),但是不給值,這時,雙冒號 :: 會有鍵名,而單冒號 : 則什么都沒有。 第三段是空格形式的選項值,雙冒號 :: 有鍵名但沒有值,單冒號 : 鍵值正常。 第四段是等號 = 形式的選項值,單雙冒號都正常接收到鍵值。 選項參數(shù)中斷上文中我們提到過參數(shù)中斷的問題,就是在選項參數(shù)之后如果有一個非選項參數(shù)的參數(shù)出現(xiàn),getopt() 就無法再獲取到這個非選項參數(shù)后面的所有內(nèi)容了。 // php 如何獲取PHP命令行參數(shù).php -f=22 aa -b=33 通過這個測試可以清晰的看出后面的 b 選項無法獲取。這時,如果我們想知道選項參數(shù)在什么地方或者因為哪個參數(shù)而中斷的話,就可以使用 getopt() 函數(shù)的第三個參數(shù)了。 // php 如何獲取PHP命令行參數(shù).php -f=22 aa -b=33 注釋已經(jīng)寫得很清晰了,第三個參數(shù)會回調(diào)一個參數(shù)選項中斷位置的索引,并且這個索引是和 $argv 的索引順序位置一致的。 總結說實話,在沒看文檔前真的只知道有一個 $argv 變量可以用來獲取命令行腳本的參數(shù),通過這次學習才發(fā)現(xiàn)原來還有一個這么強大的選項參數(shù)函數(shù)。學習的過程非常簡單,如何運用到真實的項目中才是關鍵所在,加油學習,努力實踐吧! 測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96PHP%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.php 參考文檔: https://www./manual/zh/reserved.variables.argv.phphttps://www./manual/zh/function.getopt.php |
|
來自: 硬核項目經(jīng)理 > 《待分類》