how to redirect STDOUT to a file in PHP?

前端 未结 7 979
不思量自难忘°
不思量自难忘° 2020-11-27 11:56

The code below almost works, but it\'s not what I really meant:

ob_start();
echo \'xxx\';
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($f         


        
相关标签:
7条回答
  • 2020-11-27 12:01

    Using eio pecl module eio is very easy, also you can capture PHP internal errors, var_dump, echo, etc. In this code, you can found some examples of different situations.

    $fdout = fopen('/tmp/stdout.log', 'wb');
    $fderr = fopen('/tmp/stderr.log', 'wb');
    
    eio_dup2($fdout, STDOUT);
    eio_dup2($fderr, STDERR);
    eio_event_loop();
    
    fclose($fdout);
    fclose($fderr);
    
    // output examples
    echo "message to stdout\n";
    
    $v2dump = array(10, "graphinux");
    var_dump($v2dump);
    
    // php internal error/warning
    $div0 = 10/0;
    
    // user errors messages
    fwrite(STDERR, "user controlled error\n");
    

    Call to eio_event_loop is used to be sure that previous eio requests have been processed. If you need append on log, on fopen call, use mode 'ab' instead of 'wb'.

    Install eio module is very easy (http://php.net/manual/es/eio.installation.php). I tested this example with version 1.2.6 of eio module.

    0 讨论(0)
  • 2020-11-27 12:01

    You can install Eio extension

    pecl install eio

    and duplicate a file descriptor

    $temp=fopen('/tmp/my_stdout','a');
    $my_data='my something';
    $foo=eio_dup2($temp,STDOUT,EIO_PRI_MAX,function($data,$esult,$request){
        var_dump($data,$esult,$request);
        var_dump(eio_get_last_error($request));
    },$my_data);
    eio_event_loop();
    echo "something to stdout\n";
    fclose($temp);
    

    this creates new file descriptor and rewrites target stream of STDOUT

    this can be done with STDERR as well

    and constants STD[OUT|ERR] are still usable

    0 讨论(0)
  • 2020-11-27 12:03

    None of the answers worked for my particular case where I needed a cross platform way of redirecting the output as soon as it was echo'd out so that I could follow the logs with tail -f log.txt or another log viewing app. I came up with the following solution:

    $logFp = fopen('log.txt', 'w');
    
    ob_start(function($buffer) use($logFp){
        fwrite($logFp, $buffer);
    }, 1); //notice the use of chunk_size == 1
    
    echo "first output\n";
    sleep(10)
    echo "second output\n";
    
    ob_end_clean();
    

    I haven't noticed any performance issues but if you do, you can change chunk_size to greater values.

    Now just tail -f the log file:

    tail -f log.txt
    
    0 讨论(0)
  • 2020-11-27 12:07

    here's a way to divert OUTPUT which appears to be the original problem

    $ob_file = fopen('test.txt','w');
    
    function ob_file_callback($buffer)
    {
      global $ob_file;
      fwrite($ob_file,$buffer);
    }
    
    ob_start('ob_file_callback');
    

    more info here:

    http://my.opera.com/zomg/blog/2007/10/03/how-to-easily-redirect-php-output-to-a-file

    0 讨论(0)
  • 2020-11-27 12:07

    Here is an ugly solution that was useful for a problem I had (need to debug).

    if(file_get_contents("out.txt") != "in progress")
    {
        file_put_contents("out.txt","in progress");
        $content = file_get_contents('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        file_put_contents("out.txt",$content);
    }
    

    The main drawback of that is that you'd better not to use the $_POST variables. But you dont have to put it in the very beggining.

    0 讨论(0)
  • 2020-11-27 12:08

    No, output buffering is as good as it gets. Though it's slightly nicer to just do

    ob_start();
    echo 'xxx';
    $contents = ob_get_flush();
    file_put_contents($file,$contents);
    
    0 讨论(0)
提交回复
热议问题