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(); }
$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();
/** * 创建一个子进程 * @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"); } }