how to get output of proc_open()

后端 未结 2 1021
迷失自我
迷失自我 2021-01-01 19:51

I\'ve tried to get output from proc_open method in php, but, when I print it, I got empty.

$descriptorspec = array(
    0 => array(\"pipe\", \"r\"),
         


        
相关标签:
2条回答
  • 2021-01-01 20:28

    this is another example with proc_open(). I am using Win32 ping.exe command in this example. CMIIW

    set_time_limit(1800);
    ob_implicit_flush(true);
    
    $exe_command = 'C:\\Windows\\System32\\ping.exe -t google.com';
    
    $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin
        1 => array("pipe", "w"),  // stdout -> we use this
        2 => array("pipe", "w")   // stderr 
    );
    
    $process = proc_open($exe_command, $descriptorspec, $pipes);
    
    if (is_resource($process))
    {
    
        while( ! feof($pipes[1]))
        {
            $return_message = fgets($pipes[1], 1024);
            if (strlen($return_message) == 0) break;
    
            echo $return_message.'<br />';
            ob_flush();
            flush();
        }
    }
    

    Hope this helps =)

    0 讨论(0)
  • 2021-01-01 20:41

    Your code more or less works for me. time prints its output to stderr so if you're looking for that output, look in your file files/temp/error-output.txt. The stdout pipe $pipes[1] will only contain the output of the program ./a.

    My repro:

    [edan@edan tmp]$ cat proc.php 
    
    <?php
    
    $cwd='/tmp';
    $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("file", "/tmp/error-output.txt", "a") );
    
    $process = proc_open("time ./a a.out", $descriptorspec, $pipes, $cwd);
    
    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    
    ?>
    
    [edan@edan tmp]$ php proc.php 
    
    a.out here.
    
    [edan@edan tmp]$ cat /tmp/error-output.txt
    
    real    0m0.001s
    user    0m0.000s
    sys     0m0.002s
    
    0 讨论(0)
提交回复
热议问题