如何獲取PHP命令行參數(shù)

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比元寶山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式元寶山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋元寶山地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
使用 PHP 開發(fā)的同學(xué)多少都會接觸過 CLI 命令行。經(jīng)常會有一些定時任務(wù)或者一些腳本直接使用命令行處理會更加的方便,有些時候我們會需要像網(wǎng)頁的 GET 、 POST 一樣為這些命令行腳本提供參數(shù)。比如在針對某些日期做統(tǒng)計的腳本,就需要傳遞一個日期給它,這樣我們就統(tǒng)計指定日期的一些數(shù)據(jù)。這類需求應(yīng)該非常常見,那么,我們都是如何來接收這些命令行的參數(shù)的呢?今天,就來介紹一下這方面的內(nèi)容。
$argv 獲得所有空格分隔的參數(shù)列表
這個變量估計是大家用得比較多的一個接參變量了。它是 PHP 為我們準(zhǔn)備好的一個固定變量,目的就是獲取傳遞給腳本的參數(shù)數(shù)組。
print_r($argv); // php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd // Array // ( // [0] = 如何獲取PHP命令行參數(shù).php // [1] = --a=1 // [2] = -b=2 // [3] = -c=3 // [4] = -d=4 // [5] = --e=5 // [6] = ccc // [7] = ddd // )
這個數(shù)組是以參數(shù)間隔的空格進(jìn)行分隔的。第1個元素是當(dāng)前運行的腳本文件名,也就是說,不管有沒有參數(shù),這個變量一定會有一個 $argv[0] 表示的是當(dāng)前的腳本文件名。
在日常的開發(fā)需求中,其實使用這個變量就已經(jīng)夠用了。但是這明顯不會是我們今天的主題,大家注意到上面的代碼中我們有很多參數(shù)是 -x=xxx 的形式,這種形式的參數(shù)是不是和 Linux 的命令選項非常像,沒錯,這就是我們今天要重點介紹的:從命令行參數(shù)列表中獲取選項。
getopt() 從命令行參數(shù)列表中獲取選項
其實就是這樣一個簡單的函數(shù),我們就可以像 Linux 的命令選項一樣獲取指定的命令值。而且不是像 $argv 按空格進(jìn)行分隔,命令選項函數(shù)會將這些命令選項封裝成數(shù)組,組成以選項名為鍵,以等號后面的內(nèi)容為值的數(shù)組,更加方便我們的使用。
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('a:b:c:d:e:f:')); // Array // ( // [b] = 2 // [c] = 3 // [d] = 4 // )
是不是很神奇,而且非常直觀吧,我們直接就拿到了 b 、 c 、d 的內(nèi)容并且是格式非常清晰的鍵值數(shù)組形式。有同學(xué)要問了,a 和 e 呢?還有后面的 ccc 、 ddd 呢?
首先要說明的是,ccc 和 ddd 不是標(biāo)準(zhǔn)的選項參數(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 print_r(getopt('', ['a:','b:','c:','d:','e:','f:'])); // Array // ( // [a] = 1 // [e] = 5 // )
沒錯,getopt() 函數(shù)的第二個參數(shù)就是定義這種 -- 開頭的長選項的,而且需要注意的是,第一個參數(shù)是字符串類型,第二個長選項參數(shù)是數(shù)組類型的。那么我們把它們結(jié)合起來,就當(dāng)然可以獲取到全部的參數(shù)信息啦!
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('a:b:c:d:e:f:', ['a:','b:','c:','d:','e:','f:'])); // Array // ( // [a] = 1 // [b] = 2 // [c] = 3 // [d] = 4 // [e] = 5 // )
OK,參數(shù)選項獲取沒問題了吧,細(xì)心的同學(xué)肯定又發(fā)現(xiàn)了一個問題,這個 getopt() 函數(shù)的參數(shù)中定義的選項名稱后面為啥都要加個冒號?這就涉及到我們的冒號規(guī)則了,請直接往下看。
冒號規(guī)則
getopt() 的前兩個參數(shù)都支持一套關(guān)于選項獲取的規(guī)則:
單獨的字符(不接受值) 后面跟隨冒號的字符(此選項需要值) 后面跟隨兩個冒號的字符(此選項的值可選)
我們還是直接通過代碼來看一下。
// 一 // php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('abcdef')); // Array // ( // [b] = // [c] = // [d] = // ) // 二 // php 如何獲取PHP命令行參數(shù).php -f print_r(getopt('f::')); // Array // ( // [f] = // ) print_r(getopt('f:')); // Array // ( // ) // 三 // php 如何獲取PHP命令行參數(shù).php -f 22 print_r(getopt('f::')); // Array // ( // [f] = // ) print_r(getopt('f:')); // Array // ( // [f] = 22 // ) // 四 // php 如何獲取PHP命令行參數(shù).php -f=22 print_r(getopt('f::')); // Array // ( // [f] = 22 // ) print_r(getopt('f:')); // Array // ( // [f] = 22 // )
這一段比較長,我們一塊一塊來看。首先是不帶冒號的 abcdef 寫法,返回的數(shù)組中都包含鍵,但沒有值,對應(yīng)上面的規(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 // 選項的解析會終止于找到的第一個非選項,之后的任何東西都會被丟棄。 // Array // ( // [f] = 22 // )
通過這個測試可以清晰的看出后面的 b 選項無法獲取。這時,如果我們想知道選項參數(shù)在什么地方或者因為哪個參數(shù)而中斷的話,就可以使用 getopt() 函數(shù)的第三個參數(shù)了。
// php 如何獲取PHP命令行參數(shù).php -f=22 aa -b=33 $optind = null; getopt('f:b:', [], $optind); echo $optind, PHP_EOL; // 返回中斷位置的索引值,2 echo $argv[$optind], PHP_EOL; // 等同于 $argv 的索引順序,aa
注釋已經(jīng)寫得很清晰了,第三個參數(shù)會回調(diào)一個參數(shù)選項中斷位置的索引,并且這個索引是和 $argv 的索引順序位置一致的。
總結(jié)
說實話,在沒看文檔前真的只知道有一個 $argv 變量可以用來獲取命令行腳本的參數(shù),通過這次學(xué)習(xí)才發(fā)現(xiàn)原來還有一個這么強大的選項參數(shù)函數(shù)。學(xué)習(xí)的過程非常簡單,如何運用到真實的項目中才是關(guān)鍵所在,加油學(xué)習(xí),努力實踐吧!
測試代碼:
thinkphp 的c方法是獲取配置信息的,使用的時候C('配置信息的名稱')這樣就可以去到配置信息的內(nèi)容了。
簡單的請求格式
GET /index.php HTTP/1.0
host:
當(dāng)我們和服務(wù)器連接上之后,發(fā)送上面的數(shù)據(jù)過去,服務(wù)器就會返回 index.php 這個頁面給我們。
GET 這個 是表示 以什么方式請求,HTTP中還有很多其他的請求方式,常用的就 GET POST (更詳細(xì)的 可以點開上面 http協(xié)議 那個鏈接)
GET 后面緊跟一個空格 然后 給出,要獲取的資源的名稱, /index.php 就表示獲取網(wǎng)站服務(wù)器根目錄下 index.php 執(zhí)行后所產(chǎn)生的內(nèi)容,我們也可以改成 GET / HTTP/1.0 這就表示獲取默認(rèn)首頁的內(nèi)容 。 GET /1.html HTTP/1.0 就是獲取 服務(wù)器根目錄下 1.html的內(nèi)容,很容易理解吧。
接下來隔一個空格 跟上 HTTP/1.0 表示 http協(xié)議的版本,這個是固定的 。
第二行 host: 用來指定 訪問哪個主機。 大家都知道,一個服務(wù)器可以放很多個網(wǎng)站,每個網(wǎng)站有不同的域名,所以我們需要用這個host來指定 我們要訪問的是哪個網(wǎng)站,這樣 才能正確得訪問到我們想訪問的網(wǎng)站。
第一步,連接服務(wù)器。
第二步,按照http協(xié)議,發(fā)送請求數(shù)據(jù),然后就是接受返回的內(nèi)容。
沒錯,就這么簡單。
在編寫程序之前,我們先用一個小工具來模擬一下這個過程,好讓我們對http協(xié)議了解更深入一些。
telnet工具 如果是 win7下的朋友 猛戳這里--win7開啟telnet功能
到此為止,我假設(shè)大家電腦上已經(jīng)開啟了 telnet功能,正題開始。
telnet 他是一個基于tcp/ip 協(xié)議的程序,為我們用戶提供一個 與其他電腦通信的工具,我們可以使用他來和其他電腦進(jìn)行連接通信。
開始-運行-輸入telnet回車, 出現(xiàn)一個黑框如下。
我們這時就可以輸入命令,來連接遠(yuǎn)程主機,比如我們這次是要連接我們自學(xué)去論壇 的服務(wù)器,
那么我們就輸入 open 80 然后回車。
open 是打開的意思 后面跟上 要打開那個主機 然后 后面跟上端口, web服務(wù)器默認(rèn)使用的是80端口,所以 要加上80端口(不加端口 telnet默認(rèn)是23端口)。
然后會出現(xiàn)下圖的情況,這時候 我們就可以輸入命令了,輸入的命令都將被發(fā)送到自學(xué)去論壇的服務(wù)器上面。大家注意一下 下圖紅色箭頭所指出的部分,那里就是一個輸入光標(biāo),不用管其他的字。
這就代表 我們已經(jīng)和遠(yuǎn)程主機連接上了,就相當(dāng)于我們上節(jié)課中 客戶端執(zhí)行到 connect 函數(shù) 之后 就是要調(diào)用 send函數(shù)發(fā)送數(shù)據(jù)了,在這里 我們只需要按鍵盤輸入到黑色窗口中 就會發(fā)送到服務(wù)端。
我們依次輸入以下內(nèi)容,(注意,不能按退格,輸入錯誤了,就重新打開telnet,重新操作。)
網(wǎng)站題目:c獲取php數(shù)據(jù),php獲取數(shù)據(jù)類型
網(wǎng)頁鏈接:http://chinadenli.net/article36/dsegosg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站導(dǎo)航、做網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站排名、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)