首页 > 系统相关 >yii2+rabbitmq实现队列(windows)

yii2+rabbitmq实现队列(windows)

时间:2024-03-13 15:45:39浏览次数:17  
标签:php log windows rabbitmq queue job yii2 event

1.安装Erlang 官方网站,https://erlang.org/download/otp_versions_tree.html,选择和rabbitmq适配的

2.安装RabbitMQ 官方网站,windows:https://www.rabbitmq.com/docs/install-windows

3.安装下载的Erlang和RabbitMQ

 

碰到的问题:

1. 开启rabbitmq服务时dos窗口一闪而逝,看了服务进程状态是开启状态立马变成了未开启状态,参考了:

https://blog.csdn.net/qq_40808232/article/details/102861014

重新配置了环境变量,

dos进入rabbitmq安装目录的sbin下,

安装插件,命令:rabbitmq-plugins.bat enable rabbitmq_management,

将 C:\Users\Administrator\.erlang.cookie 同步至C:\Windows\System32\config\systemprofile\.erlang.cookie 

同时删除:C:\Users\Administrator\AppData\Roaming\RabbitMQ目录

输入命令:rabbitmq-plugins.bat enable rabbitmq_management ,检查插件安装成功

这时候应该能进rabbitmq管理后台了(http://localhost:15672)

2. 当前php环境没有php_amqp扩展(有的话应该能跳过)

下载地址:https://pecl.php.net/package/amqp/1.11.0/windows,我下的是1.11.0,选择和本地php版本适配的下载,存在非线程安全 (NTS) ;线程安全 (TS),这个不是很懂,就都下载下来试了一下(试了一下下面的复制转移)

参考了

https://segmentfault.com/q/1010000015206078

复制php_amqp.dll 到php/ext/
复制rabbitmq.4.dll 到php/
复制rabbitmq.4.dll 到windows/system32/ (如32位) ,64位则windows/SysWOW64/

php.ini 加入
extension=php_amqp.dll

重启服务

3. 怎么通过yii2项目使用队列功能

composer require enqueue/amqp-lib(消息队列库)

yii2项目的web.php,components中添加

'test_queue' => [
            'class' => yii\queue\amqp_interop\Queue::class,
            'host' => env('rabbitmq_host'),
            'port' => env('rabbitmq_port'),
            'user' => env('rabbitmq_username'),
            'password' => env('rabbitmq_password'),
            'queueName' => 'test_queue',
            'exchangeName' => 'test_exchange',
            'connectionTimeout' => 5,
            'readTimeout' => 5,
            'serializer' => yii\queue\serializers\JsonSerializer::class,
            'driver' => yii\queue\amqp_interop\Queue::ENQUEUE_AMQP_LIB,
            'as log' => \app\behavior\TaskBehavior::class,
            'heartbeat' => 30,
        ],

5672:client端通信端口(应该是能更改的,没有研究)
15672:管理界面ui端口

上面的rabbitmq_port使用的是client端口5672,其他的rabbitmq参数都换成自己的

继续TaskBehavior文件创建一个:

<?php

namespace app\behavior;

use app\utils\LoggerUtil;
use yii\helpers\ArrayHelper;
use yii\queue\ExecEvent;
use yii\queue\JobEvent;
use yii\queue\JobInterface;
use yii\queue\LogBehavior;
use yii\queue\PushEvent;

/**
 * Class TaskBehavior
 * @package app\behavior
 */
class TaskBehavior extends LogBehavior
{
    /**
     * @param PushEvent $event
     */
    public function afterPush(PushEvent $event)
    {
        $this->log($event, 'push');
    }

    public function beforeExec(ExecEvent $event)
    {
        $this->log($event, 'started');
    }

    /**
     * @param ExecEvent $event
     */
    public function afterExec(ExecEvent $event)
    {
        $this->log($event, 'execute');
    }

    public function afterError(ExecEvent $event)
    {
        $this->log($event, 'execute_error');
    }

    public function getJobParams(JobEvent $event, string $status)
    {
        $job = $event->job;
        $params = ArrayHelper::toArray($job);
        $name = $event->job instanceof JobInterface ? get_class($event->job) : 'unknown job';
        $id = $event->id;

        return [
            'job' => $name,
            'id' => $id,
            'params' => $params,
            'status' => $status,
        ];
    }

    protected function log(JobEvent $event, string $status)
    {
        $data = $this->getJobParams($event, $status);
        $filename= 'debug.log';
        if ($status == 'execute_error') {
            $data['error'] = $event->error;
            $filename = 'logstash.log';
        }

        LoggerUtil::logstash('queue', 'debug', $data, $filename);
    }


}

创建完job文件就能直接调用了

\Yii::$app->test_queue->push(new TestJob([
            'time' => time()
        ]));

testJob文件:

<?php

namespace app\jobs;

use app\utils\LoggerUtil;
use yii\base\BaseObject;
use yii\queue\JobInterface;

class TestJob extends BaseObject implements JobInterface
{
    public $time;

    public function execute($queue)
    {
        LoggerUtil::log('test', '测试job', [
            'time' => $this->time
        ]);
    }
}

最后重要的一步就是监听,php yii test-queue/listen,由于只是本地的,所以没有做supervisor保护进程

 

标签:php,log,windows,rabbitmq,queue,job,yii2,event
From: https://www.cnblogs.com/wutianfei/p/18070780

相关文章

  • 几款 Windows 开源小工具
    目录MyComputerManager功能介绍使用方法Win11恢复到win10的右键菜单软件介绍使用方法ContextMenuManager下载说明everythingMyComputerManager管理“此电脑”里删不掉的流氓“快捷方式”(包括侧边栏),同时可自己添加这类“快捷方式”Github项目地址:https://github.com/13573107......
  • Windows Server 各版本搭建终端服务器实现远程访问(03~19)
    一、WindowsServer2003左下角开始➡管理工具➡管理您的服务器,点击添加或删除角色点击下一步 勾选自定义,点击下一步蒂埃涅吉终端服务器,点击下一步 点击确定重新登录后点击确定点击开始➡管理工具➡计算机管理,展开本地用户和组,点击组可以发现有个组关门用来远程......
  • Emgu.CV.Runtime.Windows nuget 安装失败问题解决方案
    一、错误现象我正在尝试从VisualStudio2015中安装emgu.CV.runtime.windows,并通过右键单击引用并通过NuGet安装的推荐方法进行安装。但是我收到以下错误。无法安装包“Emgu.runtime.windows.msvc.rt.x6419.28.29336”。您正在尝试将此包安装到面向.NETFramework,Versio......
  • 适用于 Windows 的 5 款最佳免费数据恢复软件
    每个计算机用户都曾经历过数据丢失的情况。很容易错误地删除重要的文件和文件夹,当发生这种情况时,可能会导致不必要的心痛和压力。值得庆幸的是,可以恢复WindowsPC上丢失的数据。在本文中,我们将分享您可以使用的五种最佳Windows7/8/10/11免费数据恢复软件选项。适用于Wi......
  • 在 Windows 10/11 上哪里可以找到已删除的文件
    “在Windows10/11上哪里可以找到已删除的文件?”。事实上,这个问题有3种可能的答案。1.它们在回收站里。2.它们被删除并可以使用文件恢复工具恢复,例如奇客数据恢复。3.它们被永久删除,您永远找不到它们。尝试最好的已删除文件恢复软件来查找您需要的文件。否则,您可能会永久......
  • Windows编程系列:远线程注入
    远线程注入远线程(RemoteThread)注入是指一个进程在另一个进程中创建线程的技术,这是一种很经典的DLL注入技术。虽然比较古老,但是很实用。通过远线程注入,再配合api函数的hook技术,可以实现很多有意思的功能。  实现远线程注入的关键函数OpenProcess打开现有的本地进程,函数......
  • 实验案例:使用Windows 10桌面系统
    1、实验环境      BDON公司刚刚招聘了一位新入职员工小张。部门经理要求系统管理员带小张快速地熟悉公司环境以尽快上手工作,系统管理员为小张的计算机安装了Windows1o操作系统以后,需要小张进一步熟悉公司的Windows10桌面环境及使用系统的基本操作,以便更好地实......
  • Qt 安装与环境变量的设置(Windows 10)
    Qt安装与环境变量的设置(Windows10)Qt下载Qt下载地址我下载的是windowQt5.13.1下载后安装,安装过程很简单,中间需要注册一个qt的账户,按步骤来即可组件选择了MinGW73_32、MinGW73_64、MSVC2017_32和MSVC2017_64环境变量设置打开此电脑的属性选择高级系统设置打开环境......
  • Windows右键菜单管理程序:ContextMenuManager
    前言ContextMenuManager是一款由中国人开发免安装的纯粹的Windows右键菜单管理开源程序,可以非常方便的管理Windows电脑的右键菜单,轻松去除不必要的或者是流氓的菜单选项,使你的电脑更加的干净、清爽。程序使用非常简单,没有任何门槛,我感觉非常棒,极力推荐道友们下载使用。Github......
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
    1、前言为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以就想着将这些功能......