Echo messages while php script still executes

前端 未结 9 1064
轻奢々
轻奢々 2021-02-08 13:05

I have a php script that uses cURL and takes about 10-15 minutes to execute. What it does, it parses about 1000 pages looking for specific matches and throughout the script I ha

相关标签:
9条回答
  • 2021-02-08 13:25

    Actually you're looking for something like flush and ob_flush, however bear in mind that there are a lot of factors that can prevent your output from being flush'd as it happens.

    From the flush documentation you'll get:

    Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

    Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.

    0 讨论(0)
  • 2021-02-08 13:26

    You could create a staging table.

    The PHP script could, instead of echo'ing the message, store them into a database table (possibly memory table for performance).

    You could then periodically poll a seperate PHP script using ajax, which would query the table, and return any new messages to the client.

    0 讨论(0)
  • 2021-02-08 13:26

    You could use both flush and ob_flush, reminding to set the content type header:

    <?php
    header( 'Content-type: text/html; charset=utf-8' );
    for( $i = 0 ; $i < 10 ; $i++ ){
        echo $i . '<br>';
        flush();
        ob_flush();
        sleep(1);
    }
    

    Source: dermeister note in php.net ob_flush page.

    Tested on Firefox 42.0 and Chrome 46.0

    0 讨论(0)
  • 2021-02-08 13:37

    So, this is a old post but I found a solution for this. As I also have to make the same thing, output when the script is still running. Not any answer from here helped. First of all, I am using Win32 server(production) and XAMPP as local for tests. This example is just a proof of concept and can be modified as you please.

    <?php 
    ob_implicit_flush(true);
    for($i=1; $i<=10; $i++){
    echo "$i ...<br>";
    for($k = 0; $k < 40000; $k++) echo ' ';
    sleep(1);
    }
    ?>
    

    So, we open output buffer as implicit. Then we make a demo loop to count from 1 to 10 and display the values as they are been processed. Second loop will fill in the browsers buffer. And finally to check if everything is working well we make a sleep for 1 second. Otherwise the script will run too fast and we could not know if we achieved the goal. Hope this helps !

    0 讨论(0)
  • 2021-02-08 13:41

    Sounds to be like you have output buffering turned on.

    Calling ob_end_flush() will print what's currently in the buffer, and turn off the buffer for the rest of the script execution.

    0 讨论(0)
  • 2021-02-08 13:44

    You can use the flush() function to send all the content of the buffer to the client. http://php.net/manual/fr/function.flush.php

    0 讨论(0)
提交回复
热议问题