es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué stream_get_contents no funciona con ssh2?

Utilizo el siguiente código para recibir la hora del servidor Debian:

<?php
$connection = ssh2_connect('123.123.123.123', 23452);
ssh2_auth_password($connection, 'kvn', 'kvn');
$stream = ssh2_exec($connection, '/bin/date');
$err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
$dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
stream_set_blocking($err_stream, true);
stream_set_blocking($dio_stream, true);
$result_err = stream_get_contents($err_stream);
$result_dio = stream_get_contents($dio_stream);
echo ($result_dio);
?>

Pero el código se bloquea en la línea:

$result_err = stream_get_contents($err_stream);

He intentado fgets() pero el código también se bloquea. ¿Por qué es posible? ¿Cómo puedo recibir una cadena desde el stream? ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema puede ser debido al almacenamiento en búfer del flujo de error. Para evitar esto, puedes intentar usar stream_set_chunk_size() para establecer el tamaño del fragmento del flujo y luego utilizar stream_get_contents() para leer el flujo.

    <?php
    $connection = ssh2_connect('123.123.123.123', 23452);
    ssh2_auth_password($connection, 'kvn', 'kvn');
    $stream = ssh2_exec($connection, '/bin/date');
    $err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
    $dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
    stream_set_blocking($err_stream, true);
    stream_set_blocking($dio_stream, true);
    
    // establecer el tamaño del fragmento para el flujo de error
    stream_set_chunk_size($err_stream, 1);
    
    $result_err = stream_get_contents($err_stream);
    $result_dio = stream_get_contents($dio_stream);
    
    echo ($result_dio);
    ?>
    

    En este código, he agregado stream_set_chunk_size() para el flujo de error con el fin de establecer el tamaño del fragmento en 1. Esto debería evitar el almacenamiento en búfer y permitir que stream_get_contents() lea correctamente el flujo.

Comments are closed.