udokmeci/yii2-beanstalk

位于Paul Annesley的pheanstalk之上的Yii2 Beanstalk客户端

1.0.4 2020-11-12 08:41 UTC

This package is auto-updated.

Last update: 2024-09-21 15:38:22 UTC


README

Yii2 beanstalkd 网页和控制台组件,它是基于 pda/pheanstalk 的接口。感谢 Paul Annesley 完成如此出色的作品。

如何使用?

使用Composer安装

只需将以下行添加到您的 composer.json 文件中的 require 对象下。

{
  "require": {
  ...
    "udokmeci/yii2-beanstalk" : "^1.0.0"
  }
}

然后运行

$> composer update

配置

现在在 components 下,将以下行添加到您的 mainconsole 配置文件中。

'beanstalk'=>[
    'class' => 'udokmeci\yii2beanstalk\Beanstalk',
    'host' => '127.0.0.1', // default host
    'port' => 11300, //default port
    'connectTimeout' => 1,
    'sleep' => false, // or int for usleep after every job 
],

现在将以下行添加到您的 console 配置中。

...
'params' => $params,
// add you controller with name and class name next to params.
'controllerMap' => [
    'worker' => [
        'class' => 'app\commands\WorkerController',
    ]
],

生产

现在如果一切正常,您可以使用 beandstalkd 并像这样访问控制器:

\Yii::$app->beanstalk
    ->putInTube('tube', $mixedData, $priority, $delay);

$mixedData 是从 v1.0 开始添加的,用于复杂使用。除了 string 以外,任何其他类型的都会以 json 格式发送。因此,您可以在其中发送任何由 json 支持的内容。

工作进程

对于工作进程,它也有一个内置的控制器,该控制器运行无限循环并等待新的工作。大部分工作都在 BeanstalkController 中完成。您需要做的只是创建一个像下面这样的控制器和动作。

控制器

在您的 commands 文件夹下创建一个控制器。给它起任何名字,并从 udokmeci\yii2beanstalk\BeanstalkController 扩展您的控制器

示例控制器
<?php
namespace app\commands;

use udokmeci\yii2beanstalk\BeanstalkController;
use yii\helpers\Console;
use Yii;

class WorkerController extends BeanstalkController
{
  // Those are the default values you can override

  const DELAY_PRIORITY = "1000"; //Default priority
  const DELAY_TIME = 5; //Default delay time

  // Used for Decaying. When DELAY_MAX reached job is deleted or delayed with 
  const DELAY_MAX = 3; 

  public function listenTubes(){
    return ["tube"];
  }

  /**
   *
   * @param Pheanstalk\Job $job
   * @return string  self::BURY
   *                 self::RELEASE
   *                 self::DELAY
   *                 self::DELETE
   *                 self::NO_ACTION
   *                 self::DECAY
   *  
   */
  public function actionTube($job){
	    $sentData = $job->getData();
	    try {
    	   // something useful here



           if($everythingIsAllRight == true){
                fwrite(STDOUT, Console::ansiFormat("- Everything is allright"."\n", [Console::FG_GREEN]));
                //Delete the job from beanstalkd
                return self::DELETE; 
           }

           if($everythingWillBeAllRight == true){
                fwrite(STDOUT, Console::ansiFormat("- Everything will be allright"."\n", [Console::FG_GREEN]));
                //Delay the for later try
                //You may prefer decay to avoid endless loop
                return self::DELAY; 
           }

           if($IWantSomethingCustom==true){
                Yii::$app->beanstalk->release($job);
                return self::NO_ACTION;
           }

           fwrite(STDOUT, Console::ansiFormat("- Not everything is allright!!!"."\n", [Console::FG_GREEN]));
           //Decay the job to try DELAY_MAX times.
           return self::DECAY; 

           // if you return anything else job is burried.
	    } catch (\Exception $e) {
            //If there is anything to do.
            fwrite(STDERR, Console::ansiFormat($e."\n", [Console::FG_RED]));
            // you can also bury jobs to examine later
            return self::BURY;
	    }
	}
}
运行工作进程

运行控制台是最简单的部分。运行 ./yii Your controller

$> php ./yii worker

控制器将告诉您,是否存在对应管道或beanstalk服务器是否可访问,以及当前正在监听哪些管道。控制器可以处理信号。因此,您可以在任何时候退出,预留的工作不会挂起。

欢迎任何分支。