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