%PDF- %PDF-
| Direktori : /home2/vacivi36/intranet.vacivitta.com.br/protected/vendor/yiisoft/yii2-queue/src/cli/ |
| Current File : //home2/vacivi36/intranet.vacivitta.com.br/protected/vendor/yiisoft/yii2-queue/src/cli/Queue.php |
<?php
/**
* @link https://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license https://www.yiiframework.com/license/
*/
namespace yii\queue\cli;
use Yii;
use yii\base\BootstrapInterface;
use yii\base\InvalidConfigException;
use yii\console\Application as ConsoleApp;
use yii\helpers\Inflector;
use yii\queue\Queue as BaseQueue;
/**
* Queue with CLI.
*
* @author Roman Zhuravlev <zhuravljov@gmail.com>
*/
abstract class Queue extends BaseQueue implements BootstrapInterface
{
/**
* @event WorkerEvent that is triggered when the worker is started.
* @since 2.0.2
*/
const EVENT_WORKER_START = 'workerStart';
/**
* @event WorkerEvent that is triggered each iteration between requests to queue.
* @since 2.0.3
*/
const EVENT_WORKER_LOOP = 'workerLoop';
/**
* @event WorkerEvent that is triggered when the worker is stopped.
* @since 2.0.2
*/
const EVENT_WORKER_STOP = 'workerStop';
/**
* @var array|string
* @since 2.0.2
*/
public $loopConfig = SignalLoop::class;
/**
* @var string command class name
*/
public $commandClass = Command::class;
/**
* @var array of additional options of command
*/
public $commandOptions = [];
/**
* @var callable|null
* @internal for worker command only
*/
public $messageHandler;
/**
* @var int|null current process ID of a worker.
* @since 2.0.2
*/
private $_workerPid;
/**
* @return string command id
* @throws
*/
protected function getCommandId()
{
foreach (Yii::$app->getComponents(false) as $id => $component) {
if ($component === $this) {
return Inflector::camel2id($id);
}
}
throw new InvalidConfigException('Queue must be an application component.');
}
/**
* @inheritdoc
*/
public function bootstrap($app)
{
if ($app instanceof ConsoleApp) {
$app->controllerMap[$this->getCommandId()] = [
'class' => $this->commandClass,
'queue' => $this,
] + $this->commandOptions;
}
}
/**
* Runs worker.
*
* @param callable $handler
* @return null|int exit code
* @since 2.0.2
*/
protected function runWorker(callable $handler)
{
$this->_workerPid = getmypid();
/** @var LoopInterface $loop */
$loop = Yii::createObject($this->loopConfig, [$this]);
$event = new WorkerEvent(['loop' => $loop]);
$this->trigger(self::EVENT_WORKER_START, $event);
if ($event->exitCode !== null) {
return $event->exitCode;
}
$exitCode = null;
try {
call_user_func($handler, function () use ($loop, $event) {
$this->trigger(self::EVENT_WORKER_LOOP, $event);
return $event->exitCode === null && $loop->canContinue();
});
} finally {
$this->trigger(self::EVENT_WORKER_STOP, $event);
$this->_workerPid = null;
}
return $event->exitCode;
}
/**
* Gets process ID of a worker.
*
* @inheritdoc
* @return int|null
* @since 2.0.2
*/
public function getWorkerPid()
{
return $this->_workerPid;
}
/**
* @inheritdoc
*/
protected function handleMessage($id, $message, $ttr, $attempt)
{
if ($this->messageHandler) {
return call_user_func($this->messageHandler, $id, $message, $ttr, $attempt);
}
return parent::handleMessage($id, $message, $ttr, $attempt);
}
/**
* @param string $id of a message
* @param string $message
* @param int $ttr time to reserve
* @param int $attempt number
* @param int|null $workerPid of worker process
* @return bool
* @internal for worker command only
*/
public function execute($id, $message, $ttr, $attempt, $workerPid)
{
$this->_workerPid = $workerPid;
return parent::handleMessage($id, $message, $ttr, $attempt);
}
}