【问题标题】:php with readline support compiled for windows为windows编译的带有readline支持的php
【发布时间】:2012-03-22 21:38:49
【问题描述】:

有没有内置readline支持的编译php包?

为了在交互模式下使用 php,需要 readline。

我查看了如何为 windows 编译 php,但它们需要我没有的 MS Visual Studio。

【问题讨论】:

    标签: php windows compilation read-eval-print-loop


    【解决方案1】:

    Readline 扩展在 Windows 上不可用。我认为可以在cygwin下编译PHP启用--with-readline选项

    【讨论】:

    • 我多年来一直在问的问题是,为什么这个基本的、必不可少的功能在 Windows 上不可用?如果操作系统没有提供任何等效功能,那么您当然可以效仿它。
    • 五年后,从 PHP v7.1 开始,readline 现在可以在 Windows 上使用
    【解决方案2】:
        //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 中工作)但总比没有任何用户输入要好(如果你真的记住了所有这些代码)。

    【讨论】:

      【解决方案3】:

      这可能有点晚了,但这是为我解决了这个问题的解决方案:按照 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 的情况下才有效。

      【讨论】:

        【解决方案4】:

        考虑到 galymzhan 的回答,在 Windows 上以交互模式运行 PHP 的另一种选择是使用其中一个 PHP REPL。你不会得到 tab 补全,因为这依赖于 readline。

        到目前为止对我有用的 REPL 是 PHP-Shell

        http://jan.kneschke.de/projects/php-shell/

        【讨论】:

        • 网站已关闭 :(
        猜你喜欢
        • 2018-08-31
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 2013-02-26
        • 2014-01-02
        • 1970-01-01
        • 2014-01-28
        • 2012-04-17
        相关资源
        最近更新 更多