Yii Console Application As A Daemon

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;

    }

  }


}