【问题标题】:PHP 7.1+ Windows readline extension not all functions existPHP 7.1+ Windows readline 扩展并非所有函数都存在
【发布时间】:2018-05-04 21:46:58
【问题描述】:

PHP7.1 的一项改进是,在 Windows 中,readline 扩展是开箱即用的。不过,我在使用所有功能时遇到了麻烦,因为它们并不全部存在。以下代码:

$functions = [
    'readline_add_history',
    'readline_callback_handler_install',
    'readline_callback_handler_remove',
    'readline_callback_read_char',
    'readline_clear_history',
    'readline_completion_function',
    'readline_info',
    'readline_list_history',
    'readline_on_new_line',
    'readline_read_history',
    'readline_redisplay',
    'readline_write_history',
    'readline'
];
foreach($functions as $function) {
    echo $function . (function_exists($function) ? ' exists' : ' does not exist') . PHP_EOL;
}

...产生以下输出:

readline_add_history exists
readline_callback_handler_install does not exist
readline_callback_handler_remove does not exist
readline_callback_read_char does not exist
readline_clear_history exists
readline_completion_function exists
readline_info exists
readline_list_history does not exist
readline_on_new_line does not exist
readline_read_history exists
readline_redisplay does not exist
readline_write_history exists
readline exists

我在PHP manual 中找不到任何关于在 Windows 中只有一部分 readline 扩展功能可用的参考。

当我调用php_info() 时,我得到以下输出:

阅读线

已启用 Readline 支持

Readline 库 WinEditLine

是否需要进行一些 php.ini 配置设置(或 CLI 参数)才能使所有功能可用?或者,是否有其他方法可以使 readline_callback_handler_install() 等功能在 Windows 中可用,或者扩展只是半生不熟?

【问题讨论】:

  • 你运行的是什么版本的 PHP?
  • php -v 的输出:PHP 7.2.2 (cli)(构建时间:2018 年 1 月 31 日 19:51:55)(ZTS MSVC15 (Visual C++ 2017) x86)

标签: php windows command-line-interface php-extension


【解决方案1】:

最初我认为您可能不知何故陷入了缺少这些功能的古老 PHP 5.0,但如果失败了,我将不得不猜测您的 PHP 二进制文件是针对没有这些功能的底层库 [或其版本] 编译的t 支持这些函数所依赖的特性。

使用ext/readline/readline.c 交叉引用缺少的函数列表我猜你缺少与ext/readline/config.m4 中定义的常量/特性HAVE_RL_CALLBACK_READ_CHARHAVE_LIBEDIT 相对应的特性。

TL;DR:编译你的 PHP 的人需要弄清楚。 [可能]

【讨论】:

  • 我使用 EasyPHP 作为我的开发服务器,它提供压缩包装的 PHP 二进制文件。我将尝试直接从 windows.php.net 下载一个线程安全的 64 位,看看是否可行。
  • 进一步调查似乎表明这实际上是您正在使用的官方 PHP 二进制文件。除此之外,他们似乎都有同样的问题。 ://
  • 没错,我的调查显示相同。我现在正在寻找一种解决方法,在 Windows 上触发 SIGINT 上的关闭处理程序。那里也有同样的实心砖墙,真是太棒了。
  • 这很糟糕 - 这意味着如果我通过 Ctrl-C 终止进程,我无法强制回滚数据库操作,这可能导致数据损坏。喜悦。是时候研究运行本地 *nix 实例了
  • 我正要建议在 VirtualBox 之类的东西中启动一个 *nix 虚拟机。您尝试使用 PHP 的 Windows 引擎盖越深,您将遇到的困难就越大,因为 PHP 非常有利于 *nix 生态系统。
【解决方案2】:

备案

PHP >= 7.4 到 8.1

是的:

  • readline_add_history
  • readline_clear_history
  • readline_completion_function
  • readline_info
  • readline_list_history
  • readline_read_history
  • readline_write_history
  • 阅读线

没有:

  • readline_callback_handler_install
  • readline_callback_handler_remove
  • readline_callback_read_char
  • readline_on_new_line
  • readline_redisplay

readline_list_history 是在 7.2 和 7.3 版本中添加的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2017-07-15
    • 2012-06-11
    相关资源
    最近更新 更多