Hi All,
Im wondering if anyone has guidance as to how to turn a Yii Console Application into a proper daemon/service.
Hi All,
Im wondering if anyone has guidance as to how to turn a Yii Console Application into a proper daemon/service.
hello mteichtahl …
can u plz tell that how can create Yii console Application …
use third party api to process images user upload
<?php
class FaceComputeCommand extends CConsoleCommand {
public function actionDetect($numberOfWorkers = 1) {
// Make sure signal to be processed.
declare(ticks = 1);
// Daemonize.
echo "Parent: " . getmypid() . ".\n";
umask(0);
$pid = pcntl_fork();
if ($pid == -1) {
echo "Parent: fork failed.\n";
} elseif ($pid) {
echo "Parent: " . getmypid() . " exiting.\n";
exit();
}
echo "Child: " . getmypid() . ".\n";
if (posix_setsid() == -1) {
echo "Child: setsid failed.\n";
}
chdir('/');
// Redirect stdin stdout and stderr, but php not support this right now.
// Log immediately, yii write to disk until process exited by default.
Yii::getLogger()->autoFlush = 1;
Yii::getLogger()->autoDump = true;
Yii::log("Master: " . getmypid() . ".", CLogger::LEVEL_INFO);
// Fork workers.
global $pids, $masterExit;
$pids = array();
$masterExit = false;
for ($i = 0; $i < $numberOfWorkers; $i++) {
$pid = pcntl_fork();
if (!$pid) {
// In worker process.
// Handle signal.
pcntl_signal(SIGTERM, "FaceComputeCommand::signalHandlerDetectWorker");
pcntl_signal(SIGHUP, "FaceComputeCommand::signalHandlerDetectWorker");
pcntl_signal(SIGINT, "FaceComputeCommand::signalHandlerDetectWorker");
global $workerName, $workerExit;
$workerName = 'Worker' . ($i + 1);
$workerExit = false;
while (true) {
// Business logic.
// If got signal, exit.
if ($workerExit) {
break;
}
}
// If go to there, exit.
Yii::log("$workerName: Exiting.", CLogger::LEVEL_INFO);
exit();
} else {
// In master process, save child process id, wait for 1 second, then fork next.
Yii::log("Master: forked worker $pid.", CLogger::LEVEL_INFO);
$pids[] = $pid;
sleep(1);
}
}
// In master process, finished fork.
// Handle signal.
pcntl_signal(SIGTERM, "FaceComputeCommand::signalHandlerDetectMaster");
pcntl_signal(SIGHUP, "FaceComputeCommand::signalHandlerDetectMaster");
pcntl_signal(SIGINT, "FaceComputeCommand::signalHandlerDetectMaster");
pcntl_signal(SIGUSR1, "FaceComputeCommand::signalHandlerDetectMaster");
while (true) {
// Wait child to exit.
$pid = pcntl_waitpid(-1, $status, WNOHANG);
while ($pid > 0) {
unset($pids[array_search($pid, $pids)]);
$pid = pcntl_waitpid(-1, $status, WNOHANG);
}
// If got signal, exit.
if ($masterExit) {
break;
}
sleep(1);
}
// Master exit.
Yii::log("Master: Exiting.", CLogger::LEVEL_INFO);
}
public static function signalHandlerDetectMaster($signo) {
global $pids, $masterExit;
Yii::log("Master: Got signal $signo.", CLogger::LEVEL_INFO);
if ($signo == SIGTERM || $signo == SIGHUP || $signo == SIGINT) {
foreach ($pids as $pid) {
posix_kill($pid, $signo);
Yii::log("Master: Killing worker $pid.", CLogger::LEVEL_INFO);
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
}
Yii::log("Master: All my kids should be gone now. Exiting.", CLogger::LEVEL_INFO);
$masterExit = true;
} else if ($signo == SIGUSR1) {
Yii::log("Master: I currently have " . count($pids) . " children.", CLogger::LEVEL_INFO);
}
}
public static function signalHandlerDetectWorker($signo) {
global $workerName, $workerExit;
Yii::log("$workerName: Got signal $signo.", CLogger::LEVEL_INFO);
if ($signo == SIGTERM || $signo == SIGHUP || $signo == SIGINT) {
$workerExit = true;
}
}
}