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