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的使用的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章: