日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP的命令行擴展Readline相關函數的使用

瀏覽:226日期:2022-09-07 13:31:18
目錄Readline 擴展的安裝基本函數操作讀取一行命令歷史列表相關操作查看 Readline 狀態命令提示效果字符回調操作相關示例總結

readline 擴展函數實現了訪問 GNU Readline 庫的接口。這些函數提供了可編輯的命令行。一個例子是在 Bash 中允許你使用箭頭按鍵來插入字符或者翻看歷史命令。因為這個庫的交互特性,這個功能在你寫的 Web 程序中沒多大用處,但是當你寫的腳本被用在命令行中時非常有用。

Readline 擴展的安裝

Readline 擴展已經加入了 PHP 的官方安裝包中,如果是新的 PHP 環境,那么在編譯的時候加上 --with-readline 即可。另外,我們還需要安裝操作系統的 Readline 庫。當然,如果已經是正常運行的 PHP ,也可以重新編譯一下。

# yum install -y readline-devel# ./congiure xxxx --with-readline

默認情況下,如果沒有在編譯時增加 --whit-readline ,Readline 的一些函數也是可以使用的,不過它們調用的是系統的 libedit 庫。有一些函數,比如 readline_list_history() 這種函數是無法使用的。要想完整的使用 Readline 擴展的能力,那么還是需要安裝操作系統的 libreadline 庫(上面 yum 安裝的那個 readline-devel )并在 PHP 中進行相應參數的編譯安裝。

基本函數操作

Readline 擴展提供的函數不多,也非常的簡單易用。

讀取一行

$line = readline('請輸入命令:'); // 讀取命令行交互信息echo $line, PHP_EOL; // aaa

運行 PHP 代碼后,我們就進入了命令提示符等待狀態,并且會提示“請輸入命令:”,當我們輸入了 aaa 并回車之后,輸入的內容就保存到了 $line 變量中。

命令歷史列表相關操作

Readline 很強大的一個功能就是它自帶一套命令歷史記錄的功能。不過這個需要我們自己手動地將命令加入到命令歷史中。

$line = readline('請輸入命令:'); // 讀取命令行交互信息if (!empty($line)) { readline_add_history($line); // 需要手動加入到命令歷史記錄中}echo $line, PHP_EOL; // aaa$line = readline('請輸入命令:');if (!empty($line)) { readline_add_history($line);}// 命令歷史記錄列表print_r(readline_list_history());// Array// (// [0] => aaa// [1] => bbb// )

使用 readline_add_history() 函數,就可以將一條命令加入到命令歷史記錄中,然后使用 readline_list_history() 就能夠打印出我們之前在交互式環境中發送過的命令記錄。當然,如果只是這樣簡單的保存再打印那就沒意思了,它還能將這些歷史信息保存到外部文件進行存儲。

// 將命令歷史記錄寫入到一個文件中readline_write_history(’./readline_history’);// ./readline_history中// _HiStOrY_V2_// aaa// bbb// 清理命令歷史記錄readline_clear_history();print_r(readline_list_history());// Array// (// )// 從文件中讀取命令歷史記錄readline_read_history(’./readline_history’);print_r(readline_list_history());// Array// (// [0] => bbb// [1] => bbb// )

我們使用 readline_write_history() 函數將當前的命令歷史記錄保存到一個文件中,然后使用 readline_clear_history() 清理掉目前命令歷史記錄列表中的內容,這個時候打印 readline_list_history() 的話里面已經沒有任何東西了。接著,我們再使用 readline_read_history() 將命令的歷史記錄從文件中加載回來進行還原。這一套功能是不是就非常有意思了,我們可以記錄客戶的所有命令操作,不管是安全審查還是事件回放,都非常有用。

查看 Readline 狀態

// 當前命令行內部的變量信息print_r(readline_info());// Array// (// [line_buffer] => bbb// [point] => 3// [end] => 3// [mark] => 0// [done] => 1// [pending_input] => 0// [prompt] => 請輸入命令:// [terminal_name] => xterm-256color// [completion_append_character] =>// [completion_suppress_append] =>// [library_version] => 7.0// [readline_name] => other// [attempted_completion_over] => 0// )

readline_info() 函數就比較簡單了,我們可以看到最后一條交互式命令的信息,里面包括了命令輸入的內容 line_buffer ,內容長度 point ,提示信息 prompt 等內容。

命令提示效果

在 Linux 等操作系統上,我們想不起一個命令的全拼沒關系,只需要記住它的前幾個字符然后按兩個 Tab 鍵就可以得到相關的命令提示了。Readline 擴展庫當然也為我們準備了這樣的功能。

// 類似于命令行中按 Tab 鍵的提示效果readline_completion_function(function ($input, $index) { $commands = [’next’, ’exit’, ’quit’]; $matches = []; if ($input) {// 如果關鍵字包含在命令中,提示命令信息foreach ($commands as $c) { if (strpos($c, $input) !== false) {$matches[] = $c; }} }else{$matches = $commands; } return $matches;});// 使用 Tab 鍵測試一下吧$line = trim(readline('請輸入命令:'));if (!empty($line)) { readline_add_history($line);}echo $line, PHP_EOL; // 當前輸入的命令信息// 如果命令是 exit 或者 quit ,就退出程序執行if($line == ’exit’ || $line == ’quit’){ exit;}

readline_completion_function() 函數會接收一個回調函數,當在交互式命令行模式下,也就是 readline 函數調用時,按下 Tab 鍵的時候,就會進入到這個函數的回調函數中。$input 是當前已經輸入內容的值,$index 是第幾個字符。我們在這個回調函數中定義了幾個默認的命令,當你鍵入一個 n 時直接按 Tab 鍵,程序就是提示出完整的 next 命令出來。當然,多個相同的字母開頭的都是可以通過這個 $matches 數組返回呈現的。

此外,在這段代碼中,如果我們輸入了 exit 或者 quit 。將退出程序的運行。

字符回調操作相關示例

最后幾個函數我們將通過一個復雜的小測試來學習。

// 輸出的內容進入這個回調函數中function rl_callback($ret){ global $c, $prompting; echo '您輸入的內容是: $retn'; $c++; readline_add_history($ret); // 限制了就調用10次,也可以通過命令行輸入的內容來判斷,比如上面的 exit 那種進行退出 if ($c > 10) {$prompting = false;// 移除上一個安裝的回調函數句柄并且恢復終端設置readline_callback_handler_remove(); } else {// 繼續進行遞歸回調readline_callback_handler_install('[$c] 輸入點什么內容: ', ’rl_callback’); }}$c = 1;$prompting = true;// 初始化一個 readline 回調接口,然后終端輸出提示信息并立即返回,需要等待 readline_callback_read_char() 函數調用后才會進入到回調函數中readline_callback_handler_install('[$c] 輸入點什么內容: ', ’rl_callback’);// 當 $prompting 為 ture 時,一直等待輸入信息while ($prompting) { $w = null; $e = null; $r = array(STDIN); $n = stream_select($r, $w, $e, null); if ($n && in_array(STDIN, $r)) {// 當一個行被接收時讀取一個字符并且通知 readline 調用回調函數readline_callback_read_char(); }}echo '結束,完成所有輸入!n';// [1] 輸入點什么內容: A// 您輸入的內容是: A// [2] 輸入點什么內容: B// 您輸入的內容是: B// [3] 輸入點什么內容: C// 您輸入的內容是: C// [4] 輸入點什么內容: D// 您輸入的內容是: D// [5] 輸入點什么內容: E// 您輸入的內容是: E// [6] 輸入點什么內容: F// 您輸入的內容是: F// [7] 輸入點什么內容: G// 您輸入的內容是: G// [8] 輸入點什么內容: H// 您輸入的內容是: H// [9] 輸入點什么內容: I// 您輸入的內容是: I// [10] 輸入點什么內容: J// 您輸入的內容是: J// 結束,完成所有輸入!print_r(readline_list_history());// Array// (// [0] => A// [1] => B// [2] => C// [3] => D// [4] => E// [5] => F// [6] => G// [7] => H// [8] => I// [9] => J// )

首先,我們先不管上面的這個自定義的函數,直接向下看到 readline_callback_read_char() 。它的作用是當一個行被接收時讀取一個字符并且通知 readline 調用回調函數。也就是當一行輸入完成后,鍵入了回車之后,這個函數將通知 Readline 組件去調用 readline_callback_handler_install() 注冊的回調函數。

readline_callback_handler_install() 函數的功能是初始化一個 readline 回調接口,然后終端輸出提示信息并立即返回,如果在回調函數中不進行什么操作的話,這個函數就只是輸出一個提示就結束了。在我們例子中的這個回調函數 rl_callback() 中,我們根據當前接收命令的次數,判斷如果接收的命令在十次內,則繼續接收命令直到十次命令為止就調用 readline_callback_handler_remove() 移除上一個 readline_callback_handler_install() 安裝的回調并恢復終端的默認設置。

最后執行的結果就是注釋中的內容,大家也可以自己復制下代碼后運行調試,只有自己進行過的調試才能理解的更加深入。

總結

Readline 很強大,而且也是 PHP 默認安裝包中自帶的擴展。一般被加入默認的擴展都是經過時間檢驗而且非常有用的擴展,大家可以根據這些內容再進行更加深入的學習并運用到實戰中。

測試代碼:

https://github.com/zhangyue0503/dev-blog/

以上就是PHP的命令行擴展Readline相關函數的使用的詳細內容,更多關于PHP 命令行擴展Readline的使用的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲啊v在线免费视频| 91精品推荐| 婷婷久久一区| 狠狠久久伊人| 国产中文字幕一区二区三区| 精品黄色一级片| 98精品视频| 成人看片网站| 亚洲精品电影| 免费看的黄色欧美网站| 亚洲精品护士| 精品免费视频| 亚洲精品系列| 欧美中文一区二区| 欧美精品一区二区三区精品| 中文字幕在线官网| 欧美日韩精品免费观看视欧美高清免费大片 | 99久久久久国产精品| 久久美女精品| 麻豆91精品| 欧美三区不卡| 国产va免费精品观看精品视频| 日韩欧美精品| 一区视频在线| 日韩精品欧美大片| 国产精品视频一区二区三区 | 日产精品一区| 国产精品毛片| 日韩av网站在线免费观看| 久久精品三级| 欧美成人午夜| 日本成人在线网站| 国产在线一区不卡| 国内精品福利| 日韩精品免费一区二区夜夜嗨 | 国产日韩一区| 日韩免费小视频| 久久国产99| 国产精品s色| 欧美日韩在线二区| 亚洲精品黄色| 精品免费在线| 亚洲在线一区| 欧美黄色一区| 亚洲黄页一区| 国产欧美精品| 久久精品国产68国产精品亚洲| 日日夜夜免费精品| 91亚洲自偷观看高清| 日韩专区在线视频| 国产日韩免费| 欧美日韩在线观看视频小说| 日韩国产欧美三级| 久久久噜噜噜| 国产精品一区高清| 欧美日韩一二| 欧美日韩精品一区二区三区视频 | 日韩精品水蜜桃| 日本免费一区二区视频| 97se综合| 日本少妇一区二区| 久久影视一区| 国产精品亚洲二区| 亚洲免费观看| 国产一区日韩| 亚洲精品国产精品粉嫩| 色婷婷精品视频| 国产精品美女久久久久久不卡| 黄色成人在线网址| 超碰超碰人人人人精品| 国产日韩1区| 伊人成人在线视频| 国产96在线亚洲| 日韩欧美2区| 国产一区清纯| 国产videos久久| 国产日韩欧美一区二区三区| 日韩一级欧洲| 美女福利一区二区三区| 久久久精品国产**网站| 久久久久.com| 欧美激情一区| 91麻豆精品激情在线观看最新 | 国产精品久久久久77777丨| 蜜桃精品在线| 天堂日韩电影| 日韩一区二区三区高清在线观看| 日本一区中文字幕| 久久99国产精品视频| 色狠狠一区二区三区| 一区二区三区四区日本视频| 99精品在线免费在线观看| 亚洲一区网站| 亚洲免费资源| 精品精品99| 午夜一级久久| 四虎精品一区二区免费| 午夜精品网站| 国产欧美日韩综合一区在线播放| 欧美精品黄色| 99在线|亚洲一区二区| 亚洲香蕉久久| 亚洲高清不卡| 久久三级毛片| 日韩精品社区| 欧美日韩中文字幕一区二区三区 | 免费黄网站欧美| 国产成人精品亚洲线观看| 免播放器亚洲| 午夜av成人| 在线亚洲人成| 一区二区电影在线观看| 亚洲v天堂v手机在线| 日韩一区二区三免费高清在线观看| 久久天堂av| 成人午夜毛片| 日韩综合在线| 国产成人免费视频网站视频社区| 久久国产精品亚洲77777| 精品国产精品久久一区免费式 | 黑丝一区二区| 日韩电影免费网址| 国产精品久久久久久久久久齐齐 | 日本欧美一区二区| 黄色精品网站| 欧美亚洲在线日韩| 国产精品亚洲成在人线| 亚洲少妇一区| 久久国产精品99国产| 国产v综合v| 国产不卡人人| 成人免费电影网址| 99久久婷婷| 国产福利电影在线播放| 四虎成人精品一区二区免费网站| 91精品国产福利在线观看麻豆| 99日韩精品| 久久久久99| 久久久天天操| 欧美~级网站不卡| 91精品1区| 亚洲高清影视| 亚洲大全视频| 欧美99久久| 亚洲专区在线| 蜜臀精品久久久久久蜜臀| 国产在线成人| 在线日韩电影| 激情欧美国产欧美| 蜜臀av亚洲一区中文字幕| 日欧美一区二区| 国产精品视频一区视频二区| 国产+成+人+亚洲欧洲在线| 精品国产91| 99久久亚洲精品| 亚洲一区二区三区高清| 国产精品一区免费在线| 精品一区视频| 亚洲天堂一区二区| 久久亚洲风情| 你懂的亚洲视频| 色爱综合av| 综合五月婷婷| 国产精品www.| 91精品国产调教在线观看| 女人天堂亚洲aⅴ在线观看| 欧美日韩国产在线观看网站| 男人操女人的视频在线观看欧美| 亚洲欧美日韩国产综合精品二区| 国产亚洲午夜| 亚久久调教视频| 91亚洲无吗| 国产欧美在线| 欧美日韩一二三四| 国产视频一区二区在线播放| а√在线中文在线新版| 日韩久久一区二区三区| 影音国产精品| 欧美a在线观看| 成人精品国产亚洲| 国产不卡一区| 99久久九九| 蜜臀av亚洲一区中文字幕| 亚洲精品看片| 蜜桃精品视频| 免费高潮视频95在线观看网站| 99久久婷婷| 蜜臀精品一区二区三区在线观看| 日韩不卡一二三区| 国产999精品在线观看| 精品久久亚洲| 久久国产成人| 久久国产精品久久w女人spa| 国产精品色网| 91精品丝袜国产高跟在线| 国产一区丝袜| 一二三区精品| 高潮久久久久久久久久久久久久| 欧美日中文字幕| 国产欧美日本|