将异步
将异步
检查垃圾邮件处理表单提交时可能会导致一些问题。如果Akismet API变得缓慢,我们的网站为用户也将放缓。但更糟糕的是,如果我们触及Akismet超时或者API是不可用的,我们可能会失去评论。
理想情况下,我们应该提交的数据存储不出版,并立即返回一个响应。检查垃圾邮件可以做乐队。
萎靡不振的评论
我们需要引入一个状态
评论:提交
,垃圾邮件
,发表
。
添加状态
财产评论
类:
1
美元ob娱乐下载symfony控制台:实体发表评论
我们还应该确保,默认情况下,状态
被设置为提交
:
1 2 3 4 5 6 7 8 9 10 11 12 13
- - - / src /实体/ Comment.php+ + + b / src /实体/ Comment.php@@ -38 38 8 + 8 @@类评论# [ORM \列(类型:字符串,长度:255年,可以为空:true)]私人photoFilename美元;- # [ORM \列(类型:字符串,长度:255)]美元——私人状态;+ # [ORM \列(类型:字符串,长度:255年,选择:(“默认”= >“提交”)))美元+私人状态=“提交”;公共函数__toString():字符串{
创建一个数据库迁移:
1
美元ob娱乐下载symfony控制台:迁移
修改迁移到更新所有现有的评论发表
默认情况下:
1 2 3 4 5 6 7 8 9 10
- - - /迁移/ Version00000000000000.php+ + + b /迁移/ Version00000000000000.php@@ -21、6 + 21日7 @@最终类Version00000000000000延伸AbstractMigration{/ /这个()迁移是自动生成的,请根据自己的需求修改$ this - > addSql (“ALTER TABLE注释添加状态VARCHAR(255)默认\ ' \“NOT NULL”)提交;+ $ this - > addSql(“更新评论设置状态=发表”);}公共函数(模式美元):空白
迁移数据库:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
更新显示逻辑,以避免非公布的评论出现在前端:
1 2 3 4 5 6 7 8 9 10 11 12
- - - / src /仓库/ CommentRepository.php+ + + b / src /仓库/ CommentRepository.php@@ -27 7 + 27 9 @@类CommentRepository延伸ServiceEntityRepository {$ query = $ this - > createQueryBuilder (“c”) - >引入(c。=会议:会议”)+ - >引入(c。=:状态”)- > setParameter(“会议”,会议美元)+ - > setParameter(“状态”,“发表”)- > orderBy (c。createdAt, DESC) - > setMaxResults (self:: PAGINATOR_PER_PAGE) - > setFirstResult(抵消美元)
更新EasyAdmin配置能够看到评论的状态:
1 2 3 4 5 6 7 8 9 10
- - - / src /控制器/ Admin / CommentCrudController.php+ + + b / src /控制器/ Admin / CommentCrudController.php@@ -51 51 6 + 7 @@类CommentCrudController延伸AbstractCrudController - > setLabel(照片)- > onlyOnIndex ();+收益率TextField::新(状态);$ createdAt = DateTimeField::新(createdAt) - > setFormTypeOptions ([“html5”= >真的,
别忘了还通过设置更新测试状态
设备:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
- - - / src / DataFixtures / AppFixtures.php+ + + b / src / DataFixtures / AppFixtures.php@@ -37 8 + 37 16 @@类AppFixtures延伸夹具$ comment1 - > setAuthor(“法”);$ comment1 - > setEmail (fabien@example.com);$ comment1 - > setText(“这是一个伟大的会议。”);+ $ comment1 - >设置状态(“发表”);(管理器- >坚持美元comment1);+ $ comment2 =新的评论();+ $ comment2 - > setConference阿姆斯特丹($);+ $ comment2 - > setAuthor(卢卡斯);+ $ comment2 - > setEmail (lucas@example.com);+ $ comment2 - > setText(我认为这是要节制。”);+ $经理- >保存($ comment2);+管理美元= new admin ();$管理- > setRoles ([' ROLE_ADMIN ']);$管理- > setUsername(管理);
对于控制器测试,模拟验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
- - - /测试/控制器/ ConferenceControllerTest.php+ + + b /测试/控制器/ ConferenceControllerTest.php@@ 2,6 + 2,8 @@名称空间应用\ \测试控制器;+使用App \ Repository \ CommentRepository;+使用原则\ ORM \ EntityManagerInterface;使用Syob娱乐下载mfony \包\ FrameworkBundle \ \ WebTestCase测试;类ConferenceControllerTest延伸WebTestCase @@ -22年10 + 24日16 @@类ConferenceControllerTest延伸WebTestCase $客户- > submitForm(‘提交’,‘comment_form(作者)”= >“法”,“comment_form[文本]= >从自动化功能测试的一些反馈,——“comment_form(电子邮件)”= >“me@automat.ed”,(电子邮件)+ ' comment_form ' = > $邮件=“me@automat.ed”,comment_form[图片]' = >目录名(__DIR__, 2)。' /公共/图片/在建。gif”);$ this - > assertResponseRedirects ();++ / /模拟验证发表评论+ $ =自我评论::getContainer() - >获得(CommentRepository::类)- > findOneByEmail(电子邮件);+ $评论- >设置状态(“发表”);+ self:: getContainer () - > (EntityManagerInterface::类)- >冲洗();+客户端- > followRedirect美元();$ this - > assertSelectorExists (“div:包含(有两个评论)');}
从PHPUnit)测试,您可以从容器通过获得任何服务自我::getContainer () - > ()
;它也给获得非公开服务。
理解信使
管理异步代码与Symfony是信使的工作组件:ob娱乐下载
1
美元ob娱乐下载symfony作曲家点播doctrine-messenger
当一些逻辑应该是异步执行的,发送一个消息到一个信使号公共汽车。公共汽车将信息存储在一个队列并返回立即让流的操作尽可能快的恢复。
一个消费者在后台运行不断阅读新队列上的消息和执行相关的逻辑。消费者可以运行在同一台服务器上的web应用程序或在一个单独的一个。
它非常类似于HTTP请求的处理方式,除了我们没有反应。
编码一个消息处理程序
消息是一个数据对象类,不应该持有任何逻辑。它将序列化存储在一个队列,所以只有存储“简单”可序列化的数据。
创建CommentMessage
类:
在信使的世界里,我们没有控制器,但消息处理程序。
创建一个CommentMessageHandler
类新应用MessageHandler \
名称空间,知道如何处理CommentMessage
消息:
MessageHandlerInterface
是一个标记接口。它只帮助Symfony auob娱乐下载to-register和自动配置的类作为信使处理程序。按照惯例,一个处理程序的逻辑生活在一个方法调用__invoke ()
。的CommentMessage
类型提示这种方法的一个参数告诉信使这类将处理。
控制器使用新系统更新:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ 5,14 + 5,15 @@名称空间应用\控制器;使用App \实体\评论;使用App \实体\会议;使用App \ \ CommentFormType形式;+使用App \ \ CommentMessage消息;使用App \ Repository \ CommentRepository;使用App \ Repository \ ConferenceRepository;用程序\ SpamChecker;使用原则\ ORM \ EntityManagerInterface;控制器使ob娱乐下载用Symfony \包\ FrameworkBundle \ \ AbstractController;组件使用ob娱乐下载Symfony \ \ HttpFoundation \文件\ \ FileException异常;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;+使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\路由\注释\路线;用树枝\环境;@@ -20年11 + 21日13 @@类ConferenceController延伸AbstractController{私人美元树枝;私人entityManager美元;美元+私人公交;——公共职能__construct(环境树枝美元,EntityManagerInterface entityManager美元)+公共职能__construct(环境树枝美元,EntityManagerInterface entityManager美元,美元MessageBusInterface总线){$ this - >枝= $树枝;$ this - > entityManager = $ entityManager;+ $ this - >总线= $总线;}#(路线(' / ',名字:“主页”)]@@ -36年7 + 39岁7 @@类ConferenceController延伸AbstractController} #(路线(“/会议/{蛞蝓}”,名字:“会议”))公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元,SpamChecker SpamChecker美元,字符串photoDir美元):反应+公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元,字符串photoDir美元):反应{$评论=新的评论();$ = $ this - > createForm形式(CommentFormType::类,评论美元);@@ -54 6 + 57 7 @@类ConferenceController延伸AbstractController} $ this - > entityManager - >保存($评论);+ $ this - > entityManager - >冲洗();$上下文= [' user_ip ' = > $请求- > getClientIp(), @@ -61年11 + 65,8 @@类ConferenceController延伸AbstractController“推荐人”= >请求- >标题- >获取美元(“推荐人”)、“永久链接”= > $请求- > getUri ());——如果(2 = = = $ spamChecker - > getSpamScore(评论,上下文美元)){——把新\ RuntimeException(“明目张胆的垃圾邮件,走开!”);- - - - - -}- $ this - > entityManager - >冲洗();+ $ this - >总线- >调度(新CommentMessage (- > getId()发表评论,美元上下文));返回$ this - > redirectToRoute(“会议”,(“鼻涕虫”= > $会议- > getSlug ()));}
而不是根据垃圾邮件检查程序,现在我们分派总线上的消息。处理程序然后决定如何处理它。
我们取得了意想不到的东西。我们解耦控制器的垃圾邮件检查程序和逻辑转移到一个新的类,处理程序。这是一个完美的用例的公共汽车。测试的代码,它的工作原理。一切还是同步进行,但可能已经“更好”的代码。
将异步真的
默认情况下,处理程序被称为同步。异步,需要显式地为每个配置使用哪个队列处理程序中配置/包/ messenger.yaml
配置文件:
1 2 3 4 5 6 7 8
- - - / config /包/ messenger.yaml+ + + b / config /包/ messenger.yaml@@ -21年,21岁的4 + 4 @@框架:Symfonob娱乐下载y \组件\消息通知\ \ SmsMessage:异步#你的消息路由到传输- #“App \消息\信件内容”:异步+应用程序消息\ \ CommentMessage:异步
告诉总线发送的实例的配置应用\ \ CommentMessage消息
到异步
队列,该队列由DSN(定义MESSENGER_TRANSPORT_DSN
),它指向学说中的配置.env
。说白了,我们使用PostgreSQL作为我们的消息队列。
设置PostgreSQL表和触发器:
1
美元ob娱乐下载symfony控制台:迁移
和迁移数据库:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
提示
在幕后,Symfony使用Postgrob娱乐下载eSQL装入的,高性能、可伸缩的、和事务性发布/订阅系统(听
/通知
)。你也可以读RabbitMQ章如果你想使用它,而不是作为一个message broker PostgreSQL。
消费信息
如果你想提交一个新的评论,垃圾邮件检查程序不会叫了。添加一个error_log ()
调用的getSpamScore ()
方法来确认。相反,一个消息在队列中等待,准备了一些流程。
你可能会想象,Symfony提供了消费者的命ob娱乐下载令。现在运行:
1
美元ob娱乐下载symfony控制台信使:异步vv消费
它应该立即消费消息派提交的评论:
1 2 3 4 5 6 7 8 9 10 11
[好]消费信息传输“异步”。/ /工人将自动退出一旦收到了停止信号通过信使:stop-workers命令。/ /退出control - c的工人。11:30:20信息(信使)收到的消息应用\ \ CommentMessage消息(消息“消息”= >应用\ \ CommentMessage ^{…},“阶级”= >“应用程序消息\ \ CommentMessage”] 11:30:20信息[http_client]请求:“https://80cea32be1f6.rest.akismet.com/1.1/comment-check”11:30:20信息(http_client)回应:“200 https://80cea32be1f6.rest.akismet.com/1.1/comment-check”11:30:20信息(信使)消息应用\ \ CommentMessage消息由应用MessageHandler \ \ CommentMessageHandler:: __invoke(“消息”= >应用程序消息\ \ CommentMessage ^{…},“阶级”= >“应用\ \ CommentMessage消息”,“处理”= >“MessageHandler应用\ \ CommentMessageHandler: __invoke”] 11:30:20信息(信使)应用\ \ CommentMessage消息处理成功(承认运输)。["消息" = >应用程序消息\ \ CommentMessage ^{…},“阶级”= >“应用\ \ CommentMessage消息”)
消息记录消费活动,但在控制台通过即时反馈vv
国旗。你甚至应该能够发现Akismet调用API。
停止消费,出版社Ctrl + C
。
工人在后台运行
而不是推出消费者每次我们发布评论和停止后立即,我们想要运行它不断没有太多的打开终端窗口或标签页。
Symfob娱乐下载ony CLI可以管理等后台命令或工人用守护进程标记(- d
)运行
命令。
再次运行信息的消费者,但在后台发送:
1
美元ob娱乐下载src, symfony运行- d——看=配置模板,供应商symfony控制台信使:异步vv消费
的——看
必须重新启动选项告诉Symob娱乐下载fony命令每当有文件系统的变化配置/
,src /
,模板/
,或供应商/
目录。
请注意
不要使用vv
你会重复的消息服务器:日志
(登录消息和控制台消息)。
如果消费者停止工作由于某种原因(内存限制,错误,…),它将自动重新启动。如果消费者不能太快,Symfony CLI会放弃。ob娱乐下载
通过日志流ob娱乐下载symfony服务器:日志
与其他所有日志来自PHP web服务器,和应用程序:
1
美元ob娱乐下载symfony服务器:日志
使用服务器:状态
命令来列出所有背景的工人为当前项目管理:
1 2 3 4
美元ob娱乐下载symfony服务器:https://127.0.0.1:8000 Web服务器监听状态命令symfony控制台信使:使用异步运行与PID 15774(看配置/ src /模板/)
停止一个工人,停止web服务器或杀死的PID服务器:状态
命令:
1
美元杀了15774年
重试失败的消息
如果Akismet下来一边吃个口信吗?没有影响人们提交评论,但消息丢失和垃圾邮件不是检查。
信使有重试机制时异常发生时处理信息:
如果一个问题发生在处理消息时,消费者将重试3次放弃。但是而不是丢弃消息,它将存储它永久失败的
队列,它使用另一个数据库表中。
检查失败的消息和重试通过以下命令:
1 2 3
美元ob娱乐下载symfony控制台信使:失败:节目美元ob娱乐下载symfony控制台信使:失败:重试
运行工人Platform.sh
从PostgreSQL使用消息,我们需要运行信使:消费
不断的命令。在平台。上海,这是一个的角色工人:
像Symfony CLI的ob娱乐下载平台。sh管理重启和日志。
日志一个工人,使用:
1
美元ob娱乐下载syob直播appmfony云:日志——工人=所有的消息
要进一步