欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP的命令行擴展Readline相關函數的使用

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

熱門標簽:新河科技智能外呼系統怎么樣 福州人工外呼系統哪家強 地圖標注平臺怎么給錢注冊 常州地圖標注服務商 注冊400電話申請 釘釘打卡地圖標注 安裝電銷外呼系統 衡水外呼系統平臺 百度商鋪地圖標注

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 "您輸入的內容是: $ret\n";
    $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的runkit擴展如何使用
  • PHP緩存系統APCu擴展的使用
  • 如何動態查看及加載PHP擴展
  • Thinkphp使用Zxing擴展庫解析二維碼內容圖文講解
  • PHP擴展安裝方法步驟解析
  • PHP 擴展Memcached命令用法實例總結
  • PHP擴展類型及安裝方式解析
  • 如何使用Zephir輕松構建PHP擴展

標簽:六安 唐山 白城 鷹潭 遼陽 鶴崗 克拉瑪依 柳州

巨人網絡通訊聲明:本文標題《PHP的命令行擴展Readline相關函數的使用》,本文關鍵詞  PHP,的,命令行,擴展,Readline,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP的命令行擴展Readline相關函數的使用》相關的同類信息!
  • 本頁收集關于PHP的命令行擴展Readline相關函數的使用的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲一二三级电影| 成人国产精品免费观看| 精品一区二区日韩| 岛国av在线一区| 亚洲啪av永久无码精品放毛片| xxx在线播放| 91电影在线观看| 精品国产一区二区三区忘忧草| 国产精品久久看| 日韩av一区二区三区| 成人精品一区二区三区中文字幕| 中文字幕乱码一区| 91精品婷婷国产综合久久性色| 亚洲国产成人午夜在线一区| 一区二区三区四区视频精品免费 | 无码国产69精品久久久久同性| 日韩一区二区精品葵司在线| 亚洲乱码国产乱码精品精98午夜 | 精品国产大片大片大片| 欧美精品久久天天躁| 国产精品国产三级国产aⅴ无密码| 国产69精品久久久久毛片| 婷婷激情四射网| 久久久久久一二三区| 亚洲bdsm女犯bdsm网站| 不卡视频免费播放| 欧美色偷偷大香| 国产精品久线在线观看| 国产一区视频导航| 少妇精品无码一区二区三区| 日韩一级精品视频在线观看| 免费精品视频在线| 91av在线免费| 8x8x8国产精品| 美女任你摸久久| 人妻熟女aⅴ一区二区三区汇编| 欧美综合视频在线观看| 亚洲色图在线播放| 不卡大黄网站免费看| 欧美三级视频在线| 亚洲最大的成人av| 9.1成人看片免费版| 欧美一区二区在线视频| 亚洲3atv精品一区二区三区| 成人影视免费观看| 国产精品日韩精品欧美在线| 性一交一黄一片| 日本韩国精品在线| 日韩av电影免费观看高清完整版| 调教驯服丰满美艳麻麻在线视频| 欧美成人a视频| 国产东北露脸精品视频| 国产成人免费在线观看视频| 亚洲激情校园春色| 日批免费观看视频| 在线成人av影院| 黄色资源网久久资源365| 日韩一级av毛片| 久久久精品欧美丰满| 97精品电影院| 欧美亚洲免费在线一区| 麻豆精品视频在线| 在线视频国内自拍亚洲视频| 免费在线看成人av| 色久优优欧美色久优优| 中文字幕一区三区| 中出视频在线观看| 亚洲欧洲日韩av| 中文字幕无码毛片免费看| 欧美日韩久久一区| 国产乱淫av一区二区三区| 欧美日韩中字一区| 国产精品一区不卡| 色综合网色综合| 亚洲在线中文字幕| 国产一二三四区在线| 亚洲一线二线三线久久久| 99国产精品无码| 亚洲欧美另类小说视频| 国产小视频自拍| 亚洲成人精品影院| 成人观看免费视频| 午夜精品久久久久久久99水蜜桃 | 91视频91自| 欧美夫妻性生活| 成人丝袜18视频在线观看| 精品久久久久久久人人人人传媒| 91在线高清观看| 日本一区二区视频在线| 日本黄色一级网站| 欧美激情在线免费观看| 亚洲永久无码7777kkk| 一级女性全黄久久生活片免费| 国产精品一区二区亚洲| 青青草原综合久久大伊人精品 | 亚洲熟女一区二区| 亚洲摸摸操操av| 久久久精品少妇| 久久99这里只有精品| 色先锋aa成人| 国产成人av电影在线观看| 精品国产成人在线影院| 99这里都是精品| 欧美一区日本一区韩国一区| 99久久国产综合精品色伊| 欧美极品少妇xxxxⅹ高跟鞋| 中文字幕网站在线观看| 日韩电影免费在线看| 欧美日韩成人一区| 国产成人精品一区二| 亚洲精品一区在线观看| 人妻丰满熟妇aⅴ无码| 亚洲成人你懂的| 精品视频免费看| 91av免费观看| 亚洲乱码精品一二三四区日韩在线| 国产一二三四区| 美女mm1313爽爽久久久蜜臀| 91麻豆精品国产91| 免费日本黄色网址| 日韩在线观看一区二区| 一本色道a无线码一区v| 成人网男人的天堂| 亚洲欧美在线aaa| 国产精品白嫩白嫩大学美女| 成人免费高清视频在线观看| 中文字幕一区二区三区四区| 国产精品国产精品88| 成人动漫一区二区三区| 自拍偷自拍亚洲精品播放| 色av成人天堂桃色av| 97久久超碰国产精品电影| 亚洲精品美国一| 欧美日韩国产小视频| 欧美xxxx×黑人性爽| 免费一级欧美片在线观看| 精品噜噜噜噜久久久久久久久试看 | 偷拍与自拍一区| 3d成人h动漫网站入口| 国产偷人妻精品一区| 免费亚洲电影在线| 久久综合九色综合久久久精品综合 | 国产精品美女久久久久aⅴ| 特黄一区二区三区| 成人性视频网站| 一区二区三区资源| 欧美精品成人一区二区三区四区| 中文字幕人妻一区二区三区 | 欧美日韩一区 二区 三区 久久精品| 国产黄色一区二区三区| 香蕉久久一区二区不卡无毒影院| 91精品国产91久久久久久最新毛片 | 国产成人综合在线| 亚洲欧美日韩久久| 欧美精品丝袜久久久中文字幕| 久久偷拍免费视频| 国产一区二区三区av电影| 国产精品你懂的| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 91精品国产高清91久久久久久| 日本在线不卡视频一二三区| 久久婷婷国产综合国色天香| 小早川怜子一区二区的演员表| 99精品在线观看视频| 视频精品一区二区| 国产偷国产偷亚洲高清人白洁| www.狠狠爱| 国产成人超碰人人澡人人澡| 亚洲一区在线电影| 久久久久久久电影| 91久久精品日日躁夜夜躁欧美| 久久午夜夜伦鲁鲁片| 国产精品69久久久久水密桃| 亚洲综合在线免费观看| 日韩欧美电影一二三| 中文字幕丰满孑伦无码专区| 国内久久婷婷综合| 亚洲美女视频在线观看| 欧美成人官网二区| 日日骚一区二区三区| 国产三级视频网站| 亚洲小少妇裸体bbw| 91香蕉视频在线| 青青国产91久久久久久| 国产欧美久久久精品影院 | 日本视频一区二区| 国产精品免费免费| 6080日韩午夜伦伦午夜伦| 在线日韩国产网站| 中文字幕在线观看的网站| 成人毛片在线观看| 麻豆专区一区二区三区四区五区| 中文字幕在线观看一区二区| 日韩一区二区精品| 色悠悠亚洲一区二区| 色欲AV无码精品一区二区久久 | 精品人妻一区二区三区蜜桃视频| www.亚洲免费av| 精品一区二区国语对白| 亚洲五月六月丁香激情|