Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to make a php function loop every 5 seconds

Tags:

php

I am tyring to make a php function that updates every second using php itself no other languages, just pure PHP codes.

function exp(){
//do something
}

I want it to return a value each second. Like update every second.

like image 642
Bido262 Avatar asked Dec 10 '22 20:12

Bido262


2 Answers

For an application server (not a web server), best practice is to use an event loop pattern instead of sleep. This gives you the ability to run multiple timers should the need arise (sleep is blocking so nothing else can run in the mean time). Web servers on the other hand should not really be executing any long-running scripts.

Whilst other languages give you event loops out of the box (node / js for example, with setInterval), PHP does not, so you have to either use a well known library or make your own). React PHP is a widely used event loop for PHP.

Here is a quick-and-dirty "hello world" implementation of an event loop

define("INTERVAL", 5 ); // 5 seconds

function runIt() { // Your function to run every 5 seconds
    echo "something\n";
}

function checkForStopFlag() { // completely optional
    // Logic to check for a program-exit flag
    // Could be via socket or file etc.
    // Return TRUE to stop.
    return false;
}

function start() {
    $active = true;
    $nextTime   = microtime(true) + INTERVAL; // Set initial delay

    while($active) {
        usleep(1000); // optional, if you want to be considerate

        if (microtime(true) >= $nextTime) {
            runIt();
            $nextTime = microtime(true) + INTERVAL;
        }

        // Do other stuff (you can have as many other timers as you want)           

        $active = !checkForStopFlag();
    }
}

start();

In the real world you would encapsulate this nicely in class with all the whistles and bells.

Word about threading:

PHP is single threaded under the hood (any OS threading must be manually managed by the programmer which comes with a significant learning curve). So every task in your event loop will hold up the tasks that follow. Node on the other hand, for example manages OS threads under the hood, taking that "worry" away from the programmer (which is a topic of much debate). So when you call setInterval(), the engine will work its magic so that the rest of your javascript will run concurrently.

Quick final note: It could be argued that this pattern is overkill if all you want to do is have a single function do something every 5 seconds. But in the case where you start needing concurrent timers, sleep() will not be the right tool for the job.

like image 143
Maz Avatar answered Dec 22 '22 11:12

Maz


sleep() function is the function that you are looking for:

while (true) {
    my_function(); // Call your function
    sleep(5);
}
  1. While loop with always true
  2. Call your function inside while loop
  3. Wait for 5 seconds(sleep)
  4. Return the beginning of the loop

By the way it's not a logical use case of endless loops in PHP if you are executing the script through a web protocol(HTTP, HTTPS, etc.) because you will get a timeout. A rational use case could be a periodic database updater or a web crawler.

Such scripts can be executed through command line using php myscript.php or an alternative (but not recommended) way is using set_time_limit to extend the limit if you insist on using a web protocol to execute the script.

like image 34
mertyildiran Avatar answered Dec 22 '22 12:12

mertyildiran