AMQP消息队列-RabbitMQ-Symfony5全面开发
要使用AMQP消息队列,首先要安装php-amqp
扩展。我们可以在控制台中使用php -m,查看当前已经安装过的扩展。我这里已经安装过了amqp
扩展,就不再进行安装了。
在本套课程我们将学习rabbitmq
队列,我们使用docker的rabbitmq容器来提供消息队列服务。打开docker-compose.yaml
配置文件,在services配置下,我们添加下面的配置。
#docker-compose.yaml
version: '3.7'
services:
database:
image: 'mysql:5.7'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: teebblog
ports:
# To allow the host machine to access the ports below, modify the lines below.
# For example, to allow the host to connect to port 3306 on the container, you would change
# "3306" to "3306:3306". Where the first port is exposed to the host and the second is the container port.
# See https://docs.docker.com/compose/compose-file/#ports for more information.
- '8888:3306'
rabbitmq:
image: 'rabbitmq:3.8-management'
ports:
- '5672:5672'
- '15672:15672'
我们将使用rabbitmq3.8版本来进行学习,容器映射了两个端口。5672端口用于我们在配置文件中MESSENGER_TRANSPOST_DSN
环境变量的设置 ,15672端口用于在浏览器中对消息队列进行管理。
打开底部控制台,我们输入docker compose up -d
来启动容器。当前我们的容器已经启动了,我们可以在浏览器中来访问消息队列的管理端,输入localhost:15672
。我们登录rabbitmq的管理端,用户名和密码都是guest
。
下面我们就可以对消息队列进行配置了,回到项目。我们打开.env文件,注释42行代码。我们启用AMQP队列,账户和密码都是guest
。地址就是localhost:5672
。
回到浏览器,我们添加一篇文章,点击新增按钮,现在页面自动跳转到登录页面。回到项目,我们刚刚使用docker compose
命令行重启了容器,那么我们的数据库就会重置。
打开数据库客户端,来刷新一下我们的表,现在我们的teebblog数据库中并没有任何表。我们需要重置一下数据库,输入symfony console doctrine:migrations:migrate
,输入yes。执行完数据库的更改之后,运行symfony console doctrine:fixtures:load
,我们来加载数据,输入yes。
回到浏览器,我们登录admin用户。新增一篇文章,文章的名称叫做Hello world。点击添加,我们当前没有启动consume命令行。回到浏览器,我们查看一下rabbitmq
的管理端。
我们看到队列中增加了1条消息,我们点击exchanges
,在exchanges中新增了一个交换机,交换机的类型是fanout
类型,我们查看队列。这里有个messages队列,在队列中有一条消息没有被处理。
回到项目,我们启动consume命令行,输入symfony console messenger:consume -vv
,我们选择0。现在messenger组件就会从队列中获取消息,在Handler的__invoke()方法中等待了10秒之后,对消息进行了处理,发送了一封邮件。
发送完邮件之后会通知队列,当前的消息已处理,回到浏览器。现在队列中就没有了消息,我们也成功的收到了一封邮件,使用messenger组件我们没有添加过多的配置,就快速的使用了AMQP队列。
当然rabbitmq有很多的使用模型,点击exchanges,这里messenger组件自动创建了fanout模型。在下节课,我们再来深入的学习一下AMQP队列。