예제 #1
0
 public function run()
 {
     $count = 0;
     echo "Loading initial data...\n";
     $this->db = wfGetDB(DB_SLAVE, null, 'wikicities');
     $this->loadIndex();
     $this->loadImagePaths();
     echo "Processing...\n";
     foreach ($this->meta as $city) {
         echo " {$city['dbname']} ";
         flush();
         if ($this->dataExists($city['dbname'])) {
             echo "skipped (data already exists)\n";
             continue;
         }
         $lock = Lock::acquire_return('iter-' . $city['id']);
         if (!$lock) {
             echo "skipped (lock taken)\n";
             continue;
         }
         $worker = new Worker($city['dbname'], $city);
         if ($worker->run()) {
             $city = array_merge($city, $worker->get());
             $this->save($city['dbname'], $city);
         }
         $lock->release();
         echo "done\n";
     }
 }
 public function run()
 {
     $this->onMessage = array($this, 'onMessage');
     parent::run();
 }
예제 #3
0
파일: worker.php 프로젝트: knatorski/SMS
$optsConfig = array('help|h' => 'Skrypt do generowania maili i smsów do wysyłki.', 'action|a=s' => "Lista dostępnych akcji: getsms|getmail|setupsms|setupmail");
include 'init.php';
class Worker extends Logic_Cmd_Action
{
    protected $_worker;
    public function init()
    {
        parent::init();
        $this->_worker = new GearmanWorker();
    }
    protected function runAction()
    {
        $this->_worker->addServer();
        $this->_worker->addFunction('setup', array(new Logic_Gearman_Worker_Setup(), "setup"));
        $this->_worker->addFunction('sendpackage', array(new Logic_Gearman_Worker_Send(), "sendpackage"));
        while (1) {
            try {
                $this->_worker->work();
                // work() will block execution until a job is delivered
            } catch (Exception $exc) {
                $this->_logger->err($exc->getMessage());
            }
            if ($this->_worker->returnCode() != GEARMAN_SUCCESS) {
                $this->_logger->err("An error has occured during gearman worker process..");
            }
        }
    }
}
$cmd = new Worker($opts, $application);
$cmd->run();
예제 #4
0
 /**
  * 创建一个子进程
  * @param Worker $worker
  * @throws Exception
  */
 protected static function forkOneWorker($worker)
 {
     $pid = pcntl_fork();
     // 获得可用的id
     $id = self::getId($worker->workerId, 0);
     // 主进程记录子进程pid
     if ($pid > 0) {
         self::$_pidMap[$worker->workerId][$pid] = $pid;
         self::$_idMap[$worker->workerId][$id] = $pid;
     } elseif (0 === $pid) {
         // 如果设置了端口复用,则在子进程执行监听
         if ($worker->reusePort) {
             $worker->listen();
         }
         // 启动过程中尝试重定向标准输出
         if (self::$_status === self::STATUS_STARTING) {
             self::resetStd();
         }
         self::$_pidMap = array();
         self::$_workers = array($worker->workerId => $worker);
         Timer::delAll();
         self::setProcessTitle('WorkerMan: worker process  ' . $worker->name . ' ' . $worker->getSocketName());
         self::setProcessUser($worker->user);
         $worker->id = $id;
         $worker->run();
         exit(250);
     } else {
         throw new Exception("forkOneWorker fail");
     }
 }