Asynchrone Verarbeitung
Asynchrone Verarbeitung
死Uberprufung auf垃圾在内der Bearbeitung des ubermittelten修正公式萤石祖茂堂Problemen fuhren。要是死Akismet-API langsam坚持,将unsere网站欧什毛皮Benutzer * innen langsam。但还有schlimmer:我们德国Kommentare verlieren,我们在超时laufen奥得河死Akismet-API不verfugbar。
Im Idealfall sollten我们死ubermittelten Daten speichern, ohne您祖veroffentlichen zuruckliefern和sofort响应。死Uberprufung auf垃圾萤石丹unabhangig davon durchgefuhrt了。
Kommentare kennzeichnen
我们得静脉状态
feld毛皮Kommentare einfuhren:提交
,垃圾邮件
和发表
。
Fuge死状态
房地产这苏珥是评论
-Klasse hinzu:
1
美元ob娱乐下载symfony控制台:实体发表评论
我们sollten欧什sicherstellen dass火线状态
温特standardmaßig汪汪汪提交
gesetzt坚持:
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():字符串{
Erstelle Datenbankmigration:
1
美元ob娱乐下载symfony控制台:迁移
过时的迁移一个死去,嗯阿莱vorhandenen Kommentare standardmaßig汪汪汪发表
祖茂堂setzen:
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(“更新评论设置状态=发表”);}公共函数(模式美元):空白
Fuhre死Datenbankmigration军队:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
Aktualisiere Anzeigelogik死去,恩祖vermeiden dass unveroffentlichte Kommentare im前端erscheinen:
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(抵消美元)
Aktualisiere EasyAdmin-Konfiguration死去,嗯窝Zustand des Kommentars祖茂堂看清:
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”= >真的,
Denk政治,祖茂堂aktualisieren欧什模测试,indem Du状态
吧台设备hinzufugst:
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(管理);
Simuliere死Validierung毛皮死Controller-Tests:
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:包含(有两个评论)');}
杜kannst冯einem PHPUnit-Test来自jeden beliebigen服务来自超级窝容器自我::getContainer () - > ()
holen;死ermoglicht欧什窝Zugriff auf服务,不公开信德而死。
信使对
死asynchrone Verarbeitung麻省理工学院Syob娱乐下载mfony是Aufgabe der Messenger-Komponente:
1
美元ob娱乐下载symfony作曲家点播doctrine-messenger
要是逻辑学asynchron ausgefuhrt了soll后,sende一张消息(Nachricht)一个窗户Messenger-Bus。在静脉Der总线speichert死亡的信息队列(Warteschlange)和kehrt sofort选择,嗯窝Betriebsablauf如此迅速地是不是moglich wieder aufzunehmen。
静脉消费者lauft kontinuierlich im Hintergrund,嗯neue消息auf der队列祖茂堂革命和死zugehorige逻辑学auszufuhren。Der消费者萤石auf民主党gleichen服务器是不是死Webanwendung奥得河auf einem laufen separaten服务器。
Das Ganze是der艺术和威尔斯,是不是http请求behandelt的sehr ahnlich,努尔dass我们zuruckliefern响应。
窗户的消息处理程序erstellen
明信片消息这是Datenobjektklasse死keine逻辑学enthalten sollte。您将serialisiert,嗯在静脉队列gespeichert祖茂堂了,还speichere达林努尔”einfache serialisierbare Daten。
乐阁死CommentMessage
-Klasse安:
在der Messenger-Welt有我们keine控制器,sondern请。
Erstelle风景明信片CommentMessageHandler
-Klasse unt einem neuen应用MessageHandler \
名称空间,weiß死去,是不是男人麻省理工学院CommentMessage
消息umgeht:
达斯MessageHandlerInterface
dient lediglich苏珥Markierung静脉Klasse。Es hilft ob娱乐下载Symfony努尔,死Klasse automatisch祖茂堂registrieren和automatisch als Messenger-Handler祖茂堂konfigurieren。去Konvention lebt死的逻辑学进行处理程序在静脉方法的__invoke ()
。DerCommentMessage
-Type-Hint auf das一张这位方法论证“民主党的信使,welche Klasse这verarbeiten soll后。
Aktualisiere窝控制器,该死的er das neue系统verwendet:
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 ()));}
Anstatt vom垃圾邮件检查程序abhangig祖茂堂盛,senden我们修女消息zum总线的风景明信片。Der处理器entscheidet丹,er该死macht。
我们有要Unerwartetes erreicht。我们有unseren控制器vom垃圾邮件检查程序entkoppelt和死的逻辑学在neue Klasse, verschoben穴处理程序。Es是静脉perfekter Anwendungsfall毛穴总线。证人窝代码,er funktioniert。一切将带同步gemacht,河口der代码是wahrscheinlich“贝瑟”。
真正的Asynchron
Standardmaßig了处理器同步aufgerufen。在der asynchron祖茂堂了,你们杜配置/包/ messenger.yaml
-Konfigurationsdatei毛皮jeden处理器explizit konfigurieren, welche队列verwendet了soll后:
1 2 3 4 5 6 7 8
- - - / config /包/ messenger.yaml+ + + b / config /包/ messenger.yaml@@ -21年,21岁的4 + 4 @@框架:Symfonob娱乐下载y \组件\消息通知\ \ SmsMessage:异步#你的消息路由到传输- #“App \消息\信件内容”:异步+应用程序消息\ \ CommentMessage:异步
死Konfiguration怀斯特窝总线,Instanzen冯应用\ \ CommentMessage消息
一个死异步
队列祖茂堂senden,死的军队杯DSN (MESSENGER_TRANSPORT_DSN
)definiert坚持,welche wiederum祖茂堂教义verweist,是不是.env
definiert。Auf肠道Deutsch:我们nutzen PostgreSQL als Warteschlange(队列)毛皮unsere消息(柏林)。
提示
后陆窝Kulissen nutzt Symfony ob娱乐下载das在PostgreSQL integrierte performante, skalierbare和transaktionale pub / sub系统(听
/通知
)。杜kannst欧什das RabbitMQ-Kapitel革命,要是杜达斯利als请benutzt als PostgreSQL。
消息verarbeiten
要是Du versuchst杯neuen Kommentar abzugeben,将der Spam-Checker不aufgerufen。Fuge杯error_log ()
在der -AufrufgetSpamScore ()
方法hinzu,嗯你祖茂堂vergewissern。Stattdessen wartet der Warteschlange(队列)一张消息(Nachricht),死冯bestimmten Prozessen verarbeitet了萤石。
当然啦将Symfony麻省理工学院einem Vob娱乐下载erarbeitungsbefehl geliefert(消费者命令)。Fuhre估计值现在来自:
1
美元ob娱乐下载symfony控制台信使:异步vv消费
Er sollte死毛穴eingereichten Kommentar versendete消息sofort verarbeiten:
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消息”)
死Aktivitat des消息的消费者将geloggt,河口Du erhaltst sofortiges反馈der Konsole汪汪汪,indem Du dasvv
国旗ubergibst。杜solltest sogar窝Aufruf der Akismet-API看清您能。
DruckeCtrl + C
,消费者祖茂堂stoppen窝。
工人im Hintergrund ausfuhren
Anstatt窝消费者jed Mal祖茂堂starten,要是我们杯Kommentar而posten和ihn sofort紧随其后stoppen,构想我们ihn kontinuierlich ausfuhren, ohne祖茂堂有Terminalfenster奥得河- tabs geoffnet祖茂堂抗议。
死Symob娱乐下载fony CLI萤石solche Hintergrundbefehle奥得河工人verwalten, indem Du das Daemon-Flag (- d
)zusatzlich zum运行
-Befehl verwendest。
Fuhre窝消息消费者erneut来自,河口schiebe ihn窝Hintergrund:
1
美元ob娱乐下载src, symfony运行- d——看=配置模板,供应商symfony控制台信使:异步vv消费
死——看
选择teilt Symfonob娱乐下载y麻省理工,dass der Befehl neu gestartet了吵架,要是在窝Verzeichnissen Dateien配置/
,src /
,模板/
奥得河供应商/
verandert了。
请注意
Verwende走错vv
杜达sonst服务器:日志
doppelte Meldungen erhalten, (Log -和Konsolenmeldungen)。
要是der消费者来自irgendeinem浅滩不较多funktioniert (Speicherlimit, Fehler,…),将er automatisch neugestartet。和消费者祖茂堂谢尔versagt der,要是有死Symfony CLI。ob娱乐下载
日志了冯ob娱乐下载symfony服务器:日志
麻省理工学院艾伦anderen日志,死冯PHP,民主党的网络服务器和der Anwendung stammen, gesammelt:
1
美元ob娱乐下载symfony服务器:日志
Verwende窝服务器:状态
-Befehl,嗯阿莱毛皮das aktuelle Projekt verwalteten工人来自民主党Hintergrund aufzulisten:
1 2 3 4
美元ob娱乐下载symfony服务器:https://127.0.0.1:8000 Web服务器监听状态命令symfony控制台信使:使用异步运行与PID 15774(看配置/ src /模板/)
嗯杯工人祖stoppen stoppe窝网络服务器奥得河beende PID死去,死的军队的巢穴服务器:状态
-Befehl gegeben将:
1
美元杀了15774年
Fehlgeschlagene消息erneut verarbeiten
Akismet passiert,要是在内的des Verarbeitens ausgefallen静脉信息是吗?Es有keine Auswirkungen皮毛Personen,死Kommentare abgeben,但死Nachricht蒙特verloren和垃圾邮件将不uberpruft。
Der信使帽子杯Wiederholungsmechanismus,要是贝姆Verarbeiten静脉消息静脉Fehler auftritt:
要是贝姆Verarbeiten auftritt静脉静脉信息问题,将der消费者es dreimal erneut probieren, bevor er aufgibt。河口anstatt祖茂堂verwerfen死亡消息,将您在einem dauerhafteren Speicher,火线失败的
队列,gespeichert死一张安德利果汁Datenbank-Tabelle verwendet。
Uberprufe fehlgeschlagene消息和verarbeite您麻省理工学院窝folgenden Befehlen erneut:
1 2 3
美元ob娱乐下载symfony控制台信使:失败:节目美元ob娱乐下载symfony控制台信使:失败:重试
工人贝平台。sh ausfuhren
冯PostgreSQL祖茂堂bearbeiten嗯消息,得我们窝信使:消费
-Befehl kontinuierlich ausfuhren。贝的平台。上海是死了死罗尔进行工人:
是不是Sob娱乐下载ymfony CLI verwaltet平台。sh Neustarts和日志。
嗯日志毛皮杯工人祖茂堂erhalten verwende:
1
美元ob娱乐下载syob直播appmfony云:日志——工人=所有的消息
Weiterfuhrendes