<?php
/**
* NOC cronjob
*
* @package NOC
* @version 1.0
* @author Martijn Bogaard
* @copyright 2008 SiteWK
*/
require_once('../header.php');
define('__LIB_OPTIONS', __LIB_SKIP_TPL | __LIB_SKIP_ERROR_HANDLER | __LIB_SKIP_LOAD_MODULES
);
require_once('../common.php');
declare(ticks = 1);
$cChilds = 0;
function signal_handler($signal) {
if ($signal == SIGUSR1) {
//oelala ik ben een child die dood moet :D
die('CronManager: child exited!'.PHP_EOL
);
}
else if ($signal == SIGALRM) {
echo 'CronManager: Send exit signal to childs...'.PHP_EOL;
foreach ($aChilds as $childPid) {
}
die ('Caught SIGALRM: cron terminated!'.PHP_EOL
);
}
}
function create_fork() {
$pid = pcntl_fork();
if ($pid == -1) {
die('Unknown FORK ERROR!'.PHP_EOL
);
} else if ($pid) {//parent
$aChilds[$cChilds] = $pid;
$cChilds++;
} else {//child
run_fork_child();
}
}
function wait_for_childs() {
$status = null;
while ($cChilds > 0) {
foreach ($aChilds as $childPid) {
var_dump(pcntl_waitpid
($childPid,
$status, WNOHANG
));
if (pcntl_wifexited($status) || pcntl_wifsignaled($status)) {
echo 'CronManager: child ('.
$childPid.
') exited.'.PHP_EOL;
unset($aChilds[$childPid]);
$cChilds--;
}
}
}
}
function run_fork_child() {
pcntl_signal(SIGUSR1, "signal_handler", true); // waiting for signals of the parent process
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(30);
for ($i = 0; $i < 5; $i++) {
create_fork();
}
wait_for_childs();
echo 'CronManager: All clients exited normally.'.PHP_EOL;