/** * Constructor * Checks for the required gearman extension, * fetches the bootstrap and loads in the gearman worker * * @return Gearman_Worker */ public function __construct($bootstrap) { if (!extension_loaded('gearman')) { throw new RuntimeException('The PECL::gearman extension is required.'); } $this->_worker = $bootstrap->getWorker(); if (empty($this->_registerFunction)) { throw new InvalidArgumentException(get_class($this) . ' must implement a registerFunction'); } // allow for a small memory gap: $memoryLimit = ($this->_memory + 128) * 1024 * 1024; ini_set('memory_limit', $memoryLimit); $this->_worker->addFunction($this->_registerFunction, array(&$this, 'work')); $this->_worker->setTimeout($this->_timeout); $this->init(); while ($this->_worker->work() || $this->_worker->returnCode() == GEARMAN_TIMEOUT) { if ($this->_worker->returnCode() == GEARMAN_TIMEOUT) { $this->timeout(); continue; } if ($this->_worker->returnCode() != GEARMAN_SUCCESS) { $this->setError($this->_worker->returnCode() . ': ' . $this->_worker->getErrno() . ': ' . $this->_worker->error()); break; } } $this->shutdown(); }
/** * Constructor * Checks for the required gearman extension, * fetches the bootstrap and loads in the gearman worker * * @param Zend_Application_Bootstrap_BootstrapAbstract $bootstrap * @return Zend_Gearman_Worker */ public function __construct(Zend_Application_Bootstrap_BootstrapAbstract $bootstrap) { if (!extension_loaded('gearman')) { throw new RuntimeException('The PECL::gearman extension is required.'); } $this->_bootstrap = $bootstrap; $this->_worker = $this->_bootstrap->bootstrap('gearmanworker')->getResource('gearmanworker'); if (empty($this->_registerFunction)) { throw new InvalidArgumentException(get_class($this) . ' must implement a registerFunction'); } // allow for a small memory gap: $memoryLimit = ($this->_memory + 128) * 1024 * 1024; ini_set('memory_limit', $memoryLimit); $this->_worker->addFunction($this->_registerFunction, array(&$this, 'work')); $this->_worker->setTimeout($this->_timeout); $this->init(); $check = 10; $c = 0; while (@$this->_worker->work() || $this->_worker->returnCode() == GEARMAN_TIMEOUT) { $c++; if ($this->_worker->returnCode() == GEARMAN_TIMEOUT) { $this->timeout(); continue; } if ($this->_worker->returnCode() != GEARMAN_SUCCESS) { $this->setError($this->_worker->returnCode() . ': ' . $this->_worker->getErrno() . ': ' . $this->_worker->error()); break; } if ($c % $check === 0 && $this->isMemoryOverflow()) { break; // we've consumed our memory and the worker needs to be restarted } } $this->shutdown(); }
/** * The Gearman Worker processes requests passed to it from a Gearman * server. This class should be invoked as a daemon using the CLI * interface. Multiple instances can be created to handle multiple requests * asynchronously. * * // Initialize the Gearman Worker (in bootstrap) * Request_Async_Gearman::worker(); * exit(0); * * To create a daemon script, run the following command from your command * line. * * php /path/to/index.php * * @return void */ public static function worker() { $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('request_async', array('Request_Async_Gearman', 'execute_request'), Request_Async_Gearman::$context); echo Request_Async_Gearman::$context . ': Starting worker.' . "\n"; while ($worker->work() or $worker->returnCode() == GEARMAN_IO_WAIT or $worker->returnCode() == GEARMAN_NO_JOBS) { if ($worker->returnCode() == GEARMAN_SUCCESS) { continue; } echo Request_Async_Gearman::$context . ': Waiting for next job...' . "\n"; if (!$worker->wait()) { if ($worker->returnCode() == GEARMAN_NO_ACTIVE_FDS) { usleep(100); continue; } } break; } echo Request_Async_Gearman::$context . ': Stopping worker.' . "\n"; echo Request_Async_Gearman::$context . ': Worker error' . $worker->error() . "\n"; }
/** * Read auto-loader */ include __DIR__ . '/config/loader.php'; /** * Read the configuration */ $config = (include __DIR__ . '/config/config.php'); /** * Read the services */ $di = new CliDi(); include __DIR__ . '/config/services.php'; /** * Create a console application */ $console = new ConsoleApp($di); $worker = new GearmanWorker(); $worker->setId(sha1(date("d.m.Y H:i:s"))); $worker->addServer('192.168.77.56', 4730); $worker->addFunction("send_metrix_calc", function ($job) use(&$console, &$di) { $di->set('workerJob', new MetrixResponse($di, $job, new FileAdapter(__DIR__ . "/logs/workjob_" . date("d-m-Y") . ".log"))); $arguments = json_decode($job->workload(), true); $console->setDi($di); $console->handle($arguments); }); while ($worker->work()) { if (GEARMAN_SUCCESS != $worker->returnCode()) { echo "Worker failed: " . $worker->error() . "\n"; } }
<?php /* * This file is part of the schedulee/schedulee package. * * (c) Eugene Leonovich <*****@*****.**> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ require __DIR__ . '/../../vendor/autoload.php'; $worker = new \GearmanWorker(); $worker->addServer(); $workerId = uniqid(getmypid() . '_', true); $worker->addFunction('pop', function (\GearmanJob $job) use($workerId) { static $i = 0; $handler = unserialize($job->workload()); $queue = $handler->createQueue(); $queueName = $handler->getQueueName($queue); $item = $queue->pop(); printf("%s: %s item #%s\n", str_pad(++$i, 4, ' ', STR_PAD_LEFT), str_pad($queueName . ' ', 50, '.'), $item); return $workerId . ':' . $item; }); echo "Waiting for a job...\n"; while ($worker->work()) { if (GEARMAN_SUCCESS !== $worker->returnCode()) { echo $worker->error() . "\n"; exit(1); } }