user1486241
user1486241

Reputation: 110

Control php output and post it as it occurs

I am just a amateur php programmer! I have a specific requirement.

I want to control php output behaviour in my script.

What i want is this thing

myscript.php

echo "phase 1";// (output to browser immediately)
echo "Proceeding further....";
sleep (10);
echo "phase 2";// (output to the browser immediately)
sleep(10);
echo "phase end";

But what happens is all the output of echo gets dump after 20 second i mean complete output not sequencewise... How can i output it in sequence wise.. i do not know what it is called ! Please also show a example if possible it helps in understanding

Upvotes: 0

Views: 74

Answers (3)

user1486241
user1486241

Reputation: 110

I am satisfied with Dencker answer but still i now know a simpler way by using only PHP. Derived from http://www.codeproject.com/Tips/680085/Real-time-Updating-of-PHP-Output

// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);

//Flush (send) the output buffer and turn off output buffering
while (@ob_end_flush());

// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);

echo "Start<br />";

echo str_pad("",1024," ");
echo "<br />";

ob_flush();
flush();

sleep(5);        

echo "Program Output";
ob_flush();
flush();

And it does work without any server config and it is well suited for my need (temp). But i will be looking at the suggestion posted here.

Upvotes: 0

rdiz
rdiz

Reputation: 6176

You might wanna take a look at some Websocket like Rachet. For a simpler version, you just use a combination of Javascript/Ajax and PHP.

EDIT: The simplest way; the jQuery/PHP way

As requested in the comments, this is a very simple, insecure way of achieving asynchronous server work/feedback.

Server-side

//doTheWork.php
switch($_POST['step'])
{
     case 1:
         $output = shell_exec('cat text.txt'); //Do whatever you need to do here
         break;
     case 2:
         $output = shell_exec('ls');
         break;
     default:
         $output = "No or invalid step declared";
}

echo $output;

Client-side

 <!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Testing live feedback</title>
        <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <!-- Include your local version of jQuery -->
        <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    </head>
    <body>
        <div id="console">
            <h2>Output from server</h2>
            <div id="console_output">

            </div>
        </div>

        <script type="text/javascript">
            var totalSteps = 5;
            var currentStep = 0;
            var url_to_server = "http://localhost/doTheWork.php";


            function executeAndOutputData()
            {
                currentStep++;

                if(currentStep >= totalSteps) return;

                $.post(url_to_server, {step:currentStep}, function(response){
                    $("#console_output").append(response+"<br>");
                    executeAndOutputData();
                });
            }

            executeAndOutputData();
        </script>
    </body>
</html>

Upvotes: 1

Kevin Lab&#233;cot
Kevin Lab&#233;cot

Reputation: 1995

Yes you can natively with PHP using flush functions.

Example with your code :

<?
echo "phase 1";// (output to browser immediately)
echo "Proceeding further....";
flush();
ob_implicit_flush(true);
ob_flush();
sleep (10);
echo "phase 2";// (output to the browser immediately)
sleep(10);
echo "phase end";

?>

edit : But, this is just to answer you. A such code is certainly fully useless and must be improved to remove sleep calls.

Upvotes: 0

Related Questions