2012-03-22 9 views

Respuesta

4

Readline la extensión no está disponible en Windows. Creo que es posible compilar PHP bajo cygwin habilitando --with-readline opción

+0

La pregunta que he estado preguntando durante años es: * ¿por qué * esta función básica y esencial no está disponible en Windows? Si el sistema operativo no ofrece nada equivalente, seguramente podría emularlo. –

+1

Cinco años después, desde PHP v7.1 Readline ya está disponible en Windows – icc97

0

Considerando la respuesta de galymzhan, otra opción para ejecutar PHP en modo interactivo en Windows sería usar uno de los PHP REPLs. No obtendrá la finalización de pestañas, ya que depende de readline.

de la réplica que ha trabajado para mí hasta ahora es PHP-Shell

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

+0

El sitio web ahora está abajo :( – icc97

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('$ '); 
       } 
?> 

me encontré con este código directamente de la documentación de PHP. Como puede ver, no hay soporte para la biblioteca readline en máquinas Windows (al menos en un paquete ddefault) que apesta, pero puede obtener algo similar al hacer el "$ line = blah, blah" que ve en el código anterior.

Lo probé y lo hice funcionar usando el cmd estándar de la ventana (aunque creo que el modo php interactivo no funcionará en Windows no importa qué) pero es mejor que no tener ninguna entrada del usuario (si realmente recuerda todo ese código).

1

Esto podría ser un poco tarde, pero aquí está la solución que resuelve este problema para mí: En el estilo de C# 's Console, me escribió una pequeña clase que puede hacer un readLine(), así como un 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); 
    } 
} 
el uso

Ejemplo:

Console::open(); 
echo "Input something: "; 

$str = Console::readLine(); 
if (is_string($str)) 
    Console::writeLine($str); 
else 
    echo "ERROR"; 

Console::close(); 

EDIT: Este método sólo funciona obviamente, si t El proceso principal no cambia STDOUT o STDIN.

Cuestiones relacionadas