After playing around with this further, here is more functional pseudo-code
... Primary change in the placement and method of the waidpid routine.

I'm still open to comments on this ... Otherwise, I hope this snippet is
useful to someone! : )

// run forever if necessary
set_time_limit(0);

// detatch from the controlling terminal
if (!posix_setsid()) {
    die('could not detach from terminal');
}

// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

// loop forever waiting on jobs
while(1) {

    // check queue for pending jobs
    // (db lookup omitted, let's assume jobs are waiting)
    $jobs_waiting = true;
    
    if($jobs_waiting) {
        $pid = pcntl_fork();
        if($pid == -1) {
            die('could not fork');
        } else if ($pid) {
            // parent
        } else {
            // child
            // perform task on jobs waiting
            // when job(s) complete, quit
            exit();
        }
    }

    // call waitpid to collect children that
    // have already terminated
    $tpid = pcntl_waitpid(-1,$status,WNOHANG);
    //verbose output
    //if($tpid > 0) echo "Parent collected child $tpid\n";

    // wait two seconds before checking queue again
    sleep(2);
    unset($jobs_waiting);
}
    
function sig_handler($signo) {
    // blah blah
}


-Clay


> From: Clay Loveless <[EMAIL PROTECTED]>
> Date: Sat, 01 Jun 2002 12:38:18 -0700
> To: PHP-General <[EMAIL PROTECTED]>
> Subject: [PHP] pcntl functions for task manager - comments?
> 
> I'm experimenting with PHP's pcntl_* functions using the PHP cgi ... I've
> never written a daemon before, and there doesn't seem to be a lot of
> information out there about how to do this with the pcntl functions.
> 
> So, I've read what I can find on the subject as it deals with UNIX
> programming. The goal is a script that will run forever, checking a "job
> queue" ... If jobs are waiting, use pcntl_fork() to handle the jobs.
> 
> To this end, I've come up with this pseudo-code ...  Before going WAY off in
> this direction, I'd like to submit this for comments by those who've had
> more experience with this sort of thing.
> 
> ------------------
> // run forever if necessary
> set_time_limit(0);
> 
> // detatch from the controlling terminal
> if (!posix_setsid()) {
>   die('could not detach from terminal');
> }
> 
> // setup signal handlers
> pcntl_signal(SIGTERM, "sig_handler");
> pcntl_signal(SIGHUP, "sig_handler");
> 
> // loop forever waiting on jobs
> while(1) {
> 
>   // check queue for pending jobs
>   // (db lookup omitted, let's assume jobs are waiting)
>   $jobs_waiting = true;
>   
>   if($jobs_waiting) {
>       
>       $pid = pcntl_fork();
>       if($pid == -1) {
>           die('could not fork');
>       } else if ($pid) {
>       
>           // parent
>           // call waitpid to reap children that
>           // have already terminated
>           do {
>               $tpid = pcntl_waitpid(-1,$status,WNOHANG);
>               if($tpid == -1)
>                   die('error occurred while waiting for child');
>           } while (!$tpid);
>           
>       } else {
>           // child
>           // perform task on jobs waiting
>           
>           // when job(s) complete, quit
>           exit();
>       }
> 
>   }
>   // wait two seconds before checking queue again
>   sleep(2);
>   unset($jobs_waiting);
> }
>   
> function sig_handler($signo) {
>   // blah blah
> }
> --------------------
> 
> 
> I am open to suggestions or comments on this approach! Please let me know if
> you think this looks nuts.
> 
> Thanks,
> Clay
> 
> 
> -- 
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
> 


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to