readline 扩展函数实现了访问 gnu readline 库的接口。这些函数提供了可编辑的命令行。一个例子是在 bash 中允许你使用箭头按键来插入字符或者翻看历史命令。因为这个库的交互特性,这个功能在你写的 web 程序中没多大用处,但是当你写的脚本被用在命令行中时非常有用。
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_histo阳光天使 电视剧ry());// 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() 将命令的历史记录从文件中加载回来进行还原。这一套功能是不是就非常有意思了,我们可以记录客户的所有命令操作,不管是安全审查还是事件回放,都非常有用。
// 当前命令行内部的变量信息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) !== fal) { $matches[] = $c; } } }el{ $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 = fal; // 移除上一个安装的回调函数句柄并且恢复终端设置 readline_callback_handler_remove(); } el { // 继续进行递归回调 readline_callback_handler_install("[$c] 输入点什么内神奇的探险之旅400字作文容: ", '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_lect($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的使用的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-09 03:05:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/b9184f5bdad34f6b0534491ddc4e371b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP的命令行扩展Readline相关函数的使用.doc
本文 PDF 下载地址:PHP的命令行扩展Readline相关函数的使用.pdf
留言与评论(共有 0 条评论) |