PHP с поддержкой readline для Windows - PullRequest
6 голосов
/ 23 марта 2012

Есть ли скомпилированный пакет php со встроенной поддержкой readline?

readline требуется для использования php в интерактивном режиме.

Я посмотрел, как скомпилировать php для окон, но они требуют MS Visual Studio, которой у меня нет.

Ответы [ 4 ]

4 голосов
/ 23 марта 2012

Readline расширение недоступно в Windows.Я думаю, что можно скомпилировать PHP под Cygwin, включив параметр --with-readline

2 голосов
/ 05 мая 2015
    //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 отсутствует поддержка библиотеки readline (по крайней мере, в пакете ddefault), которая отстой, но вы можете получить нечто подобное, выполнив "$ line = blah, blah", который вы видите в приведенном выше коде.

Я попробовал и заставил его работать с помощью стандартного окна cmd (хотя я думаю, что интерактивный режим php не будет работать в Windows, несмотря ни на что), но это лучше, чем отсутствие какого-либо пользовательского ввода (если вы на самом деле получаетепомните весь этот код).

1 голос
/ 27 марта 2016

Это может быть немного поздно, но вот решение, которое решило эту проблему для меня: в стиле 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.

0 голосов
/ 17 декабря 2012

Учитывая ответ Галымжана, еще одним вариантом запуска PHP в интерактивном режиме в Windows может быть использование одного из PHP REPL. Вы не получите завершение табуляции, так как это зависит от readline.

REPL, который до сих пор работал для меня, это PHP-Shell

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

...