cola de mensajes de la cola ThinkPHP

Cola de Message Queue:

ThinkPHP oficial del equipo desarrolló un contrato de soporte de la expansión del servicio de cola dedicada, mediante la gestión compositor, facilidad de uso

ventajas cola de Message Queue Server:

  1. Queue construido Redis, base de datos, Topthink, Sincronización estos cuatro conductores, tal como se utiliza en la presente memoria, unidad de Redis.

  2. Cola de la cola de mensajes de resultados es grande o un poco más complicadas y requieren operaciones de retorno interfaz de lotes de terceros, se puede utilizar para enviar mensajes de texto, transmisión de correo electrónico, empuje la APP.

  3. mensaje de Message Queue puede ser distribuido o adquirida, la ejecución, eliminación, control de fallos de retransmisión, la ejecución retardada, control de tiempo de espera y otras operaciones.

desventajas cola de Message Queue:

  1. Una vez que la necesidad de procesar los datos agregados a la tarea no se puede eliminar

La dirección oficial del documento:

https://packagist.org/packages/topthink/think-queue

Instalación y configuración:

  1. Está instalado, el comando Compositor: compositor requerir topthink / pensar-cola 2.0.x-dev (en este caso, ya que la versión 3.0 es compatible con TP6 utilizan en el presente documento, se monta tp5.1 versión 2.0.x-dev)

  2. Los archivos de configuración se encuentran en application / config / queue.php

  3. Tal como se usa en este documento, el tipo es Redis, si el entorno actual no es Redis, a continuación, instalar usted mismo

  4. Los archivos de configuración son las siguientes:

    <?php
     return [
         'connector'  => 'Redis',               // 可选驱动类型:sync(默认)、Redis、database、topthink等其他自定义类型
         'expire'     => 60,                    // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
         'default'    => 'default',             // 默认的队列名称
         'host'       => '127.0.0.1',           // redis 主机ip
         'port'       => 6379,                  // redis 端口
         'password'   => '',                    // redis 连接密码
         'select'     => 0,                     // 使用哪一个 db,默认为 db0
         'timeout'    => 0,                     // redis连接的超时时间
         'persistent' => false,                 // 是否是长连接
     ];
    
  5. La aplicación de controlador \ test \ controlador \ Index.php

    <?php
    
    namespace app\test\controller;
    
    use think\Controller;
    use think\facade\Cache;
    use think\Queue;
    
    class Index extends Controller
    {
        public function index()
        {
        }
    
        /**
        * 一个使用了队列的 action
        */
        public function actionWithHelloJob()
        {
    
            // 1.当前任务将由哪个类来负责处理。 
            //   当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
            $jobHandlerClassName  = 'app\test\controller\Hello';
    
            // 2.当前任务归属的队列名称,如果为新队列,会自动创建
            $jobQueueName = "helloJobQueue";
    
            // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
            //   ( jobData 为对象时,存储其public属性的键值对 )
            $jobData = [
                'name' => 'supperl',
                'age' => 22
            ];
    
            // 4.将该任务推送到消息队列,等待对应的消费者去执行
            $isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);
    
            // database 驱动时,返回值为 1|false  ;   redis 驱动时,返回值为 随机字符串|false
            if ($isPushed !== false) {
                echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ" . "<br>";
            } else {
                echo 'Oops, something went wrong.';
            }
        }
    }
    
  6. La aplicación de controlador \ test \ controlador \ hello.php

    <?php
    
    namespace app\test\controller;
    
    use think\Controller;
    use think\queue\Job;
    
    
    class Hello extends Controller
    {
        /**
        * fire方法是消息队列默认调用的方法
        * @param Job            $job      当前的任务对象
        * @param array|mixed    $data     发布任务时自定义的数据
        */
        public function fire(Job $job, $data)
        {
            // 有些消息在到达消费者时,可能已经不再需要执行了
            $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
            if (!$isJobStillNeedToBeDone) {
                $job->delete();
                return;
            }
    
            $isJobDone = $this->doHelloJob($data);
    
            if ($isJobDone) {
                // 如果任务执行成功, 记得删除任务
                $job->delete();
                print("<info>Hello Job has been done and deleted" . "</info>\n");
            } else {
                if ($job->attempts() > 3) {
                    //通过这个方法可以检查这个任务已经重试了几次了
                    print("<warn>Hello Job has been retried more than 3 times!" . "</warn>\n");
    
                    $job->delete();
    
                    // 也可以重新发布这个任务
                    //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                    //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
                }
            }
        }
    
        /**
        * 有些消息在到达消费者时,可能已经不再需要执行了
        * @param array|mixed    $data     发布任务时自定义的数据
        * @return boolean                 任务执行的结果
        */
        private function checkDatabaseToSeeIfJobNeedToBeDone($data)
        {
            return true;
        }
    
        /**
        * 根据消息中的数据进行实际的业务处理...
        */
        private function doHelloJob($data)
        {
            print("<info>Hello Job Started. job Data is: " . var_export($data, true) . "</info> \n");
            print("<info>Hello Job is Fired at " . date('Y-m-d H:i:s') . "</info> \n");
            print("<info>Hello Job is Done!" . "</info> \n");
            return true;
        }
    }
    
  7. Realizar Crear productores empujado a los consumidores php index.php test/index/actionWithHelloJob

    1. visualización 2020-03-26 16:13:48 a new Hello Job is Pushed to the MQ<br>
  8. El gasto del consumidor php think queue:work --queue helloJobQueue

    1. visualización
      <info>Hello Job Started. job Data is: array (
      'name' => 'supperl',
      'age' => 22,
      )</info> 
      <info>Hello Job is Fired at 2020-03-26 16:21:34</info> 
      <info>Hello Job is Done!</info> 
      <info>Hello Job has been done and deleted</info>
      
  9. Configuración de guardia proceso supervisord, seguido ~ ~ ~

Publicado cuatro artículos originales · ganado elogios 0 · Vistas 66

Supongo que te gusta

Origin blog.csdn.net/qq_32450143/article/details/105122665
Recomendado
Clasificación