Asynchronous Processing With PHP

Several weeks ago I was looking on line for a way to have PHP execute a background process, so that the page didn’t hang while some functionality happened. One way to do that is to use fsockopen() to open a url to exec what you want. But I wanted to see if there was another way. This is what I came up with.

I should note that this isn’t that well tested. I ran it on a Windows and Linux system without incident to test it, but I haven’t given it a very thorough exam. Also note $call is completely unsanitized. If you’re using this and accepting anything from the web, you need to make really sure that $call is completely sane and free of evil.

< ?php
/* Note that the call itself isn’t sanitized in any way, so it’s
   important to make sure that this can’t be exploited, see
   docs for escapeshellcmd() for details
*/
 
// Demonstration
if(launchBackgroundProcess(‘touch testfile.txt’)){
    print ‘Successfully launched background process’;
}
 
 
 
/**
* Launch Background Process
*
* Launches a background process (note, provides no security itself, $call must be sanitized prior to use)
* @param string $call the system call to make
* @author raccettura
*/
function launchBackgroundProcess($call) {
 
    // Windows
    if(is_windows()){
        pclose(popen(‘start /b ‘.$call., ‘r’));
    }
 
    // Some sort of UNIX
    else {
        pclose(popen($call.‘ /dev/null &’, ‘r’));
    }
    return true;
}
 
 
/**
* Is Windows
*
* Tells if we are running on Windows Platform
* @author raccettura
*/
function is_windows(){
    if(PHP_OS == ‘WINNT’ || PHP_OS == ‘WIN32’){
        return true;
    }
    return false;
}
?>

To run a php process you can obviously use launchBackgroundProcess('php /path/to/script.php');.

Now say we wanted to load a page while retrieving data from a process to display inline. We don’t want to wait for the entire command to finish, since that could take a while, and the user may believe something is wrong and reload (slowing down the system even more). A good example of this is an online traceroute utility. Here’s a quick example of that:

< ?php
    /****
     * Again notice this is unsanitized since we trust ourselves.  Coming from the web
     * it would need to be sanitized to ensure it’s safe to use.  see escapeshellarg()
     ****/
    $hostname = ‘accettura.com’;
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Traceroute to $hostname</title>
</head>
<body>
< ?php
    if(is_windows()){
        $cmd = ‘tracert -w 10’;    
    } else {
        $cmd = ‘traceroute -w 10’;
    }
    $handle = popen("$cmd $hostname 2>&1", ‘r’);
 
    while(!feof($handle)) {
        $buffer = fgets($handle);
        $buffer = ‘<p>’.trim(htmlspecialchars($buffer)).‘</p>’;
 
        echo $buffer;
        ob_flush();
        flush();
    }
    pclose($handle);
 
 
 
   /**
    * Is Windows
    *
    * Tells if we are running on Windows Platform
    * @author raccettura
    */
    function is_windows(){
        if(PHP_OS == ‘WINNT’ || PHP_OS == ‘WIN32’){
            return true;
        }
        return false;
    }
?>
</body>
</html>

Isn’t that simple?

There’s more than 1 way to approach a problem, and there may be better ways out there. I won’t be so cocky as to think these are by any means perfect. But they may be of help to someone who also notices the lack of documentation on little (but important) things like this.

Just remember: always sanitize your input when working with stuff like this, or your putting your system at risk.

22 thoughts on “Asynchronous Processing With PHP

  1. Pingback: silentcoder.com » Blog Archive » Asynchronous Processing With PHP

  2. This looks good; I am trying to figure out a way to get a PHP script to run in the background on a Windows server.

    However, I can’t figure out your use of quotes, they seem to be uneven.

    What am I missing?

  3. Sean: you can use both ' or " in PHP as long as you use them as “This “.’that’. Single quotes won’t be evaluated. For example:

    $test = ‘value’;
     
    print "This is a $test"; // will be: This is a value
    print ‘This is a $test’; // will be: This is a $test
  4. Pingback: How To Run A PHP Script In The Background | MT-Soft Website Development

  5. this ain’t workin. any ideas? running on a linux host:

    if this is shelling out to the system, then i don’t have shell access. is there way way to do an asynchronous call to a php script WITHOUT calling the shell?

    thanks

  6. This doesn’t work with me. I don’t know what’s wrong, but lauchBackgroundProcess() doesn’t do anything. However, if I add fgets() as in the second script, it works. But, it’s not an asynchronous call!!

  7. I think the thing that was confusing ppl is the use of quotations in the following line:

    pclose(popen(‘start /b ‘.$call.”, ‘r’));

    This should actually be:

    pclose(popen(‘start /b ‘.$call, ‘r’));

    This also saved my day. Thanks man!

  8. I don’t see any asynchronous code.
    fgets ist waiting for input line.
    All you do is flushing php buffer (ob_flush(); flush()). There is no sense doing this in a pipe.
    Do something else instead of a traceroute(6) without response line by line and your code will wait unlimited.

  9. Pingback: Background Process in PHP | Ritvick Paliwal's Official Website

  10. Pingback: How To Run A PHP Script In The Background | W-Shadow.com

  11. Pingback: Run PHP Task Asynchronously - PHP Solution - Developers Q & A

  12. With broadband Internet service obtaining quicker and quicker, it is becoming more advantageous to signal up for broadband phone services, also recognized as VOIP or Voice over Internet Protocol. If you are contemplating VOIP phone service, right here are the leading five factors you should get VOIP services.

    Some folks are hesitant to share their home phone figures or spend by the minute for cell telephone phone calls. They can lease a get virtual sms number for $4.88 per thirty day period. Use that telephone quantity in your on-line profiles. I have two phone figures with this strategy-one of them forwards to my cell telephone, and the other sends callers instantly to voicemail and then sends their recorded concept to me and my wife by way of e-mail. This grants us an “official home phone number” we can share with the world and also frees us from disturbing phone phone calls while enjoying supper or night quiet time. All the phone calls go straight to voicemail. We can get to them anytime we select. I am especially anticipating quiet time when the subsequent election season arrives.

    Low-price 800 Figures: Want to make it totally free for a lot of callers with out bankrupting you? Most VoIP providers offer cheap 800 figures – free to the caller, set monthly rate for you (varies, but roughly $5 for the first 100 minutes each month, then 4.5-cents or so per minute past that).

    The next piece to spluge on for your workplace or home is the digital camera. There are a number of great cameras for $99 to $499. The Apple(tm) digital camera for the mac appears surprisingly like the professional grade pc digital camera from Polycom(tm). I use the Logitech(tm) professional series and they function great. Each computer in our workplaces has 1.

    Virtual Assistants. A virtual assistant is like an administrative assistant. They contact on their own “virtual” because they can be anyplace in the country or globe. One of my virtual assistants is in Knoxville, Tennessee. I have an additional 1 in Missouri. My internet person is in Oregon. You can use virtual assistants for various issues as they have different specialties.

    Free virtual quantity services will not provide all the features most businesses need to function on a day to day basis. For a much more sophisticated virtual quantity services visit Phone Dynamo on-line for more info.

    http://bandantoc.hanoi.gov.vn/.....fault.aspx

Leave a Reply

Your email address will not be published. Required fields are marked *