【发布时间】:2012-03-22 21:38:49
【问题描述】:
有没有内置readline支持的编译php包?
为了在交互模式下使用 php,需要 readline。
我查看了如何为 windows 编译 php,但它们需要我没有的 MS Visual Studio。
【问题讨论】:
标签: php windows compilation read-eval-print-loop
有没有内置readline支持的编译php包?
为了在交互模式下使用 php,需要 readline。
我查看了如何为 windows 编译 php,但它们需要我没有的 MS Visual Studio。
【问题讨论】:
标签: php windows compilation read-eval-print-loop
Readline 扩展在 Windows 上不可用。我认为可以在cygwin下编译PHP启用--with-readline选项
【讨论】:
//The readline library is not available on Windows.
<?php
if (PHP_OS == 'WINNT') {
echo '$ ';
$line = stream_get_line(STDIN, 1024, PHP_EOL);
} else {
$line = readline('$ ');
}
?>
我直接从 php 文档中找到了这段代码。正如您可能看到的那样,Windows 机器(至少在 ddefault 数据包中)不支持 readline 库,这很糟糕,但是您可以通过执行上面代码中看到的“$line = blah, blah”来获得类似的东西。
我尝试了它并使用窗口的标准 cmd 使其工作(尽管我认为交互式 php 模式无论如何都不会在 Windows 中工作)但总比没有任何用户输入要好(如果你真的记住了所有这些代码)。
【讨论】:
这可能有点晚了,但这是为我解决了这个问题的解决方案:按照 C# 的Console 的风格,我编写了一个可以执行readLine() 和writeLine($str) 的小类:
class Console {
const READLINE_MAX_LENGTH = 0xFFFF;
const WRITELINE_NEWLINE = "\n";
private static /*Resource*/ $stdin;
private static /*Resource*/ $stdout;
public static function /*void*/ close () {
fclose(self::$stdin);
fclose(self::$stdout);
}
public static function /*void*/ open () {
self::$stdin = fopen('php://stdin', 'r');
self::$stdout = fopen('php://stdout', 'w');
}
public static function /*string*/ readLine () {
return stream_get_line(self::$stdin, self::READLINE_MAX_LENGTH, "\r\n");
}
public static function /*void*/ writeLine (/*string*/ $str) {
fwrite(self::$stdout, $str);
fwrite(self::$stdout, self::WRITELINE_NEWLINE);
}
}
示例用法:
Console::open();
echo "Input something: ";
$str = Console::readLine();
if (is_string($str))
Console::writeLine($str);
else
echo "ERROR";
Console::close();
编辑:这种方法显然只有在父进程不改变 STDOUT 或 STDIN 的情况下才有效。
【讨论】:
考虑到 galymzhan 的回答,在 Windows 上以交互模式运行 PHP 的另一种选择是使用其中一个 PHP REPL。你不会得到 tab 补全,因为这依赖于 readline。
到目前为止对我有用的 REPL 是 PHP-Shell
【讨论】: