电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

PHP的命令行擴(kuò)展Readline相關(guān)函數(shù)的使用

瀏覽:102日期:2022-09-07 13:31:18
目錄Readline 擴(kuò)展的安裝基本函數(shù)操作讀取一行命令歷史列表相關(guān)操作查看 Readline 狀態(tài)命令提示效果字符回調(diào)操作相關(guān)示例總結(jié)

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

Readline 擴(kuò)展的安裝

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

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

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

基本函數(shù)操作

Readline 擴(kuò)展提供的函數(shù)不多,也非常的簡單易用。

讀取一行

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

運行 PHP 代碼后,我們就進(jìn)入了命令提示符等待狀態(tài),并且會提示“請輸入命令:”,當(dāng)我們輸入了 aaa 并回車之后,輸入的內(nèi)容就保存到了 $line 變量中。

命令歷史列表相關(guān)操作

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

$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() 函數(shù),就可以將一條命令加入到命令歷史記錄中,然后使用 readline_list_history() 就能夠打印出我們之前在交互式環(huán)境中發(fā)送過的命令記錄。當(dāng)然,如果只是這樣簡單的保存再打印那就沒意思了,它還能將這些歷史信息保存到外部文件進(jìn)行存儲。

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

查看 Readline 狀態(tài)

// 當(dāng)前命令行內(nèi)部的變量信息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() 函數(shù)就比較簡單了,我們可以看到最后一條交互式命令的信息,里面包括了命令輸入的內(nèi)容 line_buffer ,內(nèi)容長度 point ,提示信息 prompt 等內(nèi)容。

命令提示效果

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

// 類似于命令行中按 Tab 鍵的提示效果readline_completion_function(function ($input, $index) { $commands = [’next’, ’exit’, ’quit’]; $matches = []; if ($input) {// 如果關(guān)鍵字包含在命令中,提示命令信息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; // 當(dāng)前輸入的命令信息// 如果命令是 exit 或者 quit ,就退出程序執(zhí)行if($line == ’exit’ || $line == ’quit’){ exit;}

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

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

字符回調(diào)操作相關(guān)示例

最后幾個函數(shù)我們將通過一個復(fù)雜的小測試來學(xué)習(xí)。

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

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

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

最后執(zhí)行的結(jié)果就是注釋中的內(nèi)容,大家也可以自己復(fù)制下代碼后運行調(diào)試,只有自己進(jìn)行過的調(diào)試才能理解的更加深入。

總結(jié)

Readline 很強(qiáng)大,而且也是 PHP 默認(rèn)安裝包中自帶的擴(kuò)展。一般被加入默認(rèn)的擴(kuò)展都是經(jīng)過時間檢驗而且非常有用的擴(kuò)展,大家可以根據(jù)這些內(nèi)容再進(jìn)行更加深入的學(xué)習(xí)并運用到實戰(zhàn)中。

測試代碼:

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

以上就是PHP的命令行擴(kuò)展Readline相關(guān)函數(shù)的使用的詳細(xì)內(nèi)容,更多關(guān)于PHP 命令行擴(kuò)展Readline的使用的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 3D全息投影_地面互动投影_360度立体投影_水幕灯光秀 | 广东银虎 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 洗石机-移动滚筒式,振动,螺旋,洗矿机-青州冠诚重工机械有限公司 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页| 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司| 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 安徽华耐泵阀有限公司-官方网站| 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 玄米影院| pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 中山市派格家具有限公司【官网】| 周口市风机厂,周鼓风机,河南省周口市风机厂 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 |