在我們進(jìn)行
網(wǎng)站開發(fā)時(shí),當(dāng)用戶請(qǐng)求網(wǎng)頁(yè)時(shí),我們編寫的任何 PHP 代碼通常都在服務(wù)器上運(yùn)行。但是,也可以通過 CLI 或命令行界面運(yùn)行腳本。有時(shí)需要編寫在命令提示符中執(zhí)行時(shí)可以接受參數(shù)的 PHP 腳本。這樣做的原因有很多,從易用性到特定任務(wù)的自動(dòng)化。
當(dāng)您從 Web 瀏覽器請(qǐng)求頁(yè)面時(shí),參數(shù)作為查詢參數(shù)傳遞。在服務(wù)器端,我們使用 superglobal 訪問這些參數(shù)中的值$_GET。不幸的是,當(dāng)您在命令提示符中運(yùn)行腳本時(shí),此技術(shù)將不起作用。這是因?yàn)槊钐崾痉枰煌袷降哪_本參數(shù)。
PHP 中有兩個(gè)預(yù)定義變量被調(diào)用$argc,$argv它們可用于處理命令行參數(shù)。該變量$argc只是告訴您傳遞給腳本的參數(shù)數(shù)量。請(qǐng)記住,您正在運(yùn)行的腳本的名稱始終被視為參數(shù)。這意味著 的最小值$argc將為 1。該變量$argv更有幫助,因?yàn)樗莻鬟f給腳本的參數(shù)數(shù)組并包含它們的實(shí)際值。您可以使用循環(huán)遍歷所有值foreach。
我們?cè)谇懊娴氖纠杏糜谠L問命令行參數(shù)的方法存在一些缺點(diǎn)。例如,我們假設(shè)參數(shù)將按照我們?cè)谀_本中處理它們的順序提供。然而,情況可能并非總是如此。
getopt()PHP 中的函數(shù)是訪問所有這些參數(shù)的好方法,而無(wú)需過多擔(dān)心它們的順序等。它有一個(gè)必需參數(shù)和兩個(gè)可選參數(shù)。
1、short_options:命令行中的短選項(xiàng)以單個(gè)連字符開頭。傳入此字符串的每個(gè)字符都與傳遞給腳本的選項(xiàng)相匹配。
2、long_options:這個(gè)可選參數(shù)接受一個(gè)數(shù)組。數(shù)組中的每個(gè)元素(一個(gè)字符串)都與傳遞給腳本的選項(xiàng)相匹配,這些選項(xiàng)以兩個(gè)連字符開頭。
3、rest_index:可選的第三個(gè)參數(shù)用于存儲(chǔ)參數(shù)解析停止的索引。
無(wú)論是short_options和long_options遵循特定的約定來(lái)傳遞給腳本解析值。單個(gè)字符和字符串不接受任何值。后跟冒號(hào)的字符和字符串表示所需的值。后跟兩個(gè)冒號(hào)的字符和字符串表示可選值。這里有些例子:
1、-g并且--grayscale兩者都不會(huì)接受任何值。我們將在腳本中使用它們將圖像轉(zhuǎn)換為灰度。
2、-f:并且--filename:兩者都需要傳遞給它們的值。我們將使用它們來(lái)確保用戶向我們提供可以應(yīng)用過濾器的圖像文件。
3、-c::并且--contrast::兩者都將接受一個(gè)可選值。我們將使用它們?yōu)橛脩籼峁┎徊槐匾馗膱D像對(duì)比度的選項(xiàng)。這同樣適用于-b::和--brightness::。
您應(yīng)該記住的一件事是,由 返回的數(shù)組getopt()不包含參數(shù)列表中缺少的元素。此外,參數(shù)列表中存在的沒有指定值的元素被設(shè)置為false。
我們已經(jīng)看到,當(dāng)腳本在 Web 服務(wù)器上運(yùn)行和在 CLI 中運(yùn)行時(shí),需要使用不同的代碼來(lái)訪問參數(shù)值。但是,這并不意味著您將需要同一腳本的兩個(gè)副本才能在不同的環(huán)境中運(yùn)行。有一個(gè)被調(diào)用的函數(shù)php_sapi_name()會(huì)告訴你你的代碼是在 Web 服務(wù)器還是 CLI 中運(yùn)行。
很多時(shí)候我們必須編寫代碼來(lái)處理提供的輸入以提供一些輸出。通常情況下,輸入被處理$_GET和$_PUT當(dāng)腳本在服務(wù)器上運(yùn)行。但是,有時(shí)您需要通過 CLI 運(yùn)行腳本,這需要您使用$argv或getopt()。Usinggetopt()在處理參數(shù)時(shí)為您提供了更大的靈活性,并為您完成了一些繁重的解析工作。