ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ืคึฐึผืชึดื™ื—ึท

ื”ืืชืจ ืฉืœื™, ืื•ืชื• ืื ื™ ืžื ื”ืœ ื›ืชื—ื‘ื™ื‘, ืžื™ื•ืขื“ ืœืืจื— ื“ืคื™ ื‘ื™ืช ื•ืืชืจื™ื ืื™ืฉื™ื™ื ืžืขื ื™ื™ื ื™ื. ื”ื ื•ืฉื ื”ื–ื” ื”ืชื—ื™ืœ ืœืขื ื™ื™ืŸ ืื•ืชื™ ืžืžืฉ ื‘ืชื—ื™ืœืช ืžืกืข ื”ืชื›ื ื•ืช ืฉืœื™; ื‘ืื•ืชื• ืจื’ืข ื”ื•ืงืกืžืชื™ ืžืœืžืฆื•ื ืื ืฉื™ ืžืงืฆื•ืข ืžืขื•ืœื™ื ืฉื›ื•ืชื‘ื™ื ืขืœ ืขืฆืžื, ืขืœ ื”ืชื—ื‘ื™ื‘ื™ื ื•ื”ืคืจื•ื™ืงื˜ื™ื ืฉืœื”ื. ื”ื”ืจื’ืœ ืœื’ืœื•ืช ืื•ืชื ื‘ืขืฆืžื™ ื ืฉืืจ ืขื“ ื”ื™ื•ื: ื›ืžืขื˜ ื‘ื›ืœ ืืชืจ ืžืกื—ืจื™ ื•ืœื ืžืื•ื“ ืžืกื—ืจื™, ืื ื™ ืžืžืฉื™ืš ืœื—ืคืฉ ื‘ื›ื•ืชืจืช ื”ืชื—ืชื•ื ื” ื‘ื—ื™ืคื•ืฉ ืื—ืจ ืงื™ืฉื•ืจื™ื ืœื›ื•ืชื‘ื™ื.

ื™ื™ืฉื•ื ื”ืจืขื™ื•ืŸ

ื”ื’ืจืกื” ื”ืจืืฉื•ื ื” ื”ื™ื™ืชื” ืจืง ื“ืฃ HTML ื‘ืืชืจ ื”ืื™ืฉื™ ืฉืœื™, ืฉื‘ื• ื”ื›ื ืกืชื™ ืงื™ืฉื•ืจื™ื ืขื ื—ืชื™ืžื•ืช ืœืจืฉื™ืžืช ul. ืœืื—ืจ ืฉื”ืงืœื“ืชื™ 20 ืขืžื•ื“ื™ื ืขืœ ืคื ื™ ืชืงื•ืคื”, ื”ืชื—ืœืชื™ ืœื—ืฉื•ื‘ ืฉื–ื” ืœื ื™ืขื™ืœ ื‘ืžื™ื•ื—ื“ ื•ื”ื—ืœื˜ืชื™ ืœื ืกื•ืช ืœื”ืคื•ืš ืืช ื”ืชื”ืœื™ืš ืœืื•ื˜ื•ืžื˜ื™. ื‘-stackoverflow, ืฉืžืชื™ ืœื‘ ืฉืื ืฉื™ื ืจื‘ื™ื ืžืฆื™ื™ื ื™ื ืืชืจื™ื ื‘ืคืจื•ืคื™ืœื™ื ืฉืœื”ื, ืื– ื›ืชื‘ืชื™ ืžื ืชื— ื‘-php, ืฉืคืฉื•ื˜ ืขื‘ืจ ืขืœ ื”ืคืจื•ืคื™ืœื™ื, ื”ื—ืœ ืžื”ืจืืฉื•ืŸ (ื”ื›ืชื•ื‘ื•ืช ื‘-SO ืขื“ ื”ื™ื•ื ื”ืŸ ื›ืš: `/users/1` ), ื—ื™ืœืฅ ืงื™ืฉื•ืจื™ื ืžื”ืชื’ ื”ืจืฆื•ื™ ื•ื”ื•ืกื™ืฃ ืื•ืชื• ื‘-SQLite.

ืืคืฉืจ ืœืงืจื•ื ืœื–ื” ื”ื’ืจืกื” ื”ืฉื ื™ื™ื”: ืื•ืกืฃ ืฉืœ ืขืฉืจื•ืช ืืœืคื™ ื›ืชื•ื‘ื•ืช URL ื‘ื˜ื‘ืœืช SQLite, ืฉื”ื—ืœื™ืคื” ืืช ื”ืจืฉื™ืžื” ื”ืกื˜ื˜ื™ืช ื‘-html. ืขืฉื™ืชื™ ื—ื™ืคื•ืฉ ืคืฉื•ื˜ ื‘ืจืฉื™ืžื” ื”ื–ื•. ื›ื™ ื”ื™ื• ืจืง ื›ืชื•ื‘ื•ืช URL, ื•ืื– ื”ื—ื™ืคื•ืฉ ืคืฉื•ื˜ ื”ืชื‘ืกืก ืขืœื™ื”ืŸ.

ื‘ืฉืœื‘ ื–ื” ื ื˜ืฉืชื™ ืืช ื”ืคืจื•ื™ืงื˜ ื•ื—ื–ืจืชื™ ืืœื™ื• ืœืื—ืจ ื–ืžืŸ ืจื‘. ื‘ืฉืœื‘ ื”ื–ื” ื”ื ื™ืกื™ื•ืŸ ื‘ืขื‘ื•ื“ื” ืฉืœื™ ื”ื™ื” ื›ื‘ืจ ื™ื•ืชืจ ืžืฉืœื•ืฉ ืฉื ื™ื ื•ื”ืจื’ืฉืชื™ ืฉืื ื™ ื™ื›ื•ืœ ืœืขืฉื•ืช ืžืฉื”ื• ื™ื•ืชืจ ืจืฆื™ื ื™. ื‘ื ื•ืกืฃ, ื”ื™ื” ืจืฆื•ืŸ ื’ื“ื•ืœ ืœืฉืœื•ื˜ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื—ื“ืฉื•ืช ื™ื—ืกื™ืช.

ื’ืจืกื” ืžื•ื“ืจื ื™ืช

ืคืจื•ื™ืงื˜ ื ืคืจืก ื‘-Docker, ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื•ืขื‘ืจ ืœ-mongoDb, ื•ืœืื—ืจื•ื ื” ื ื•ืกืคื” ืฆื ื•ืŸ, ืฉื‘ื”ืชื—ืœื” ื”ื™ื” ืจืง โ€‹โ€‹ืœืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ. ืื—ืช ืžืžื™ืงืจื•-ืžืกื’ืจืช ื”-PHP ืžืฉืžืฉืช ื›ื‘ืกื™ืก.

ื‘ืขื™ื”

ืืชืจื™ื ื—ื“ืฉื™ื ืžืชื•ื•ืกืคื™ื ืขืœ ื™ื“ื™ ืคืงื•ื“ืช ืžืกื•ืฃ ืฉืขื•ืฉื” ื‘ืื•ืคืŸ ืกื™ื ื›ืจื•ื ื™ ืืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช:

  • ืžื•ืจื™ื“ ืชื•ื›ืŸ ืœืคื™ ื›ืชื•ื‘ืช URL
  • ืžื’ื“ื™ืจ ื“ื’ืœ ื”ืžืฆื™ื™ืŸ ืื HTTPS ื”ื™ื” ื–ืžื™ืŸ
  • ืฉื•ืžืจ ืขืœ ืžื”ื•ืช ื”ืืชืจ
  • HTML ื”ืžืงื•ืจ ื•ื”ื›ื•ืชืจื•ืช ื ืฉืžืจื•ืช ื‘ื”ื™ืกื˜ื•ืจื™ื™ืช ื”"ืื™ื ื“ืงืก".
  • ืžื ืชื— ืชื•ื›ืŸ, ืžื—ืœืฅ ื›ื•ืชืจืช ื•ืชื™ืื•ืจ
  • ืฉื•ืžืจ ื ืชื•ื ื™ื ืœืื•ืกืฃ ื ืคืจื“

ื–ื” ื”ืกืคื™ืง ื›ื“ื™ ืคืฉื•ื˜ ืœืื—ืกืŸ ืืชืจื™ื ื•ืœื”ืฆื™ื’ ืื•ืชื ื‘ืจืฉื™ืžื”:

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ืื‘ืœ ื”ืจืขื™ื•ืŸ ืฉืœ ืื™ื ื“ืงืก, ืกื™ื•ื•ื’ ื•ื“ื™ืจื•ื’ ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื”ื›ืœ, ืฉืžื™ืจื” ืขืœ ื”ื›ืœ ืžืขื•ื“ื›ืŸ, ืœื ื”ืฉืชืœื‘ ื”ื™ื˜ื‘ ื‘ืคืจื“ื™ื’ืžื” ื”ื–ื•. ืืคื™ืœื• ื”ื•ืกืคืช ืฉื™ื˜ืช ืื™ื ื˜ืจื ื˜ ืœื”ื•ืกืคืช ื“ืคื™ื ื“ืจืฉื” ืฉื›ืคื•ืœ ื•ื—ืกื™ืžื” ืฉืœ ืงื•ื“ ื›ื“ื™ ืœืžื ื•ืข DDoS ืคื•ื˜ื ืฆื™ืืœื™.

ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืžื•ื‘ืŸ, ื”ื›ืœ ื™ื›ื•ืœ ืœื”ื™ืขืฉื•ืช ื‘ืื•ืคืŸ ืกื™ื ื›ืจื•ื ื™, ื•ื‘ืฉื™ื˜ืช ื”ืื™ื ื˜ืจื ื˜ ืืคืฉืจ ืคืฉื•ื˜ ืœืฉืžื•ืจ ืืช ื”-URL ื›ืš ืฉื”ื“ืžื•ืŸ ื”ืžืคืœืฆืชื™ ื™ื‘ืฆืข ืืช ื›ืœ ื”ืžืฉื™ืžื•ืช ืขื‘ื•ืจ ื”-URL ืžื”ืจืฉื™ืžื”. ืื‘ืœ ืขื“ื™ื™ืŸ, ื’ื ื›ืืŸ ื”ืžื™ืœื” "ืชื•ืจ" ืžืฆื™ืขื” ืืช ืขืฆืžื”. ื•ืื ืžื™ื•ืฉื ืชื•ืจ, ืื– ื ื™ืชืŸ ืœื—ืœืง ื•ืœื‘ืฆืข ืืช ื›ืœ ื”ืžืฉื™ืžื•ืช ืœืคื—ื•ืช ื‘ืื•ืคืŸ ืืกื™ื ื›ืจื•ื ื™.

ื”ื—ืœื˜ื”

ื”ื˜ืžืขืช ืชื•ืจื™ื ื•ื™ืฆื™ืจืช ืžืขืจื›ืช ืžื•ื ืขืช ืื™ืจื•ืขื™ื ืœืขื™ื‘ื•ื“ ื›ืœ ื”ืžืฉื™ืžื•ืช. ื•ืื ื™ ื›ื‘ืจ ื”ืจื‘ื” ื–ืžืŸ ืจื•ืฆื” ืœื ืกื•ืช ืืช Redis Streams.

ืฉื™ืžื•ืฉ ื‘ื–ืจืžื™ Redis ื‘-PHP

ื›ื™ ืžื›ื™ื•ื•ืŸ ืฉื”ืžืกื’ืจืช ืฉืœื™ ื”ื™ื ืœื ืื—ืช ืžืฉืœื•ืฉืช ื”ืขื ืงื™ื Symfony, Laravel, Yii, ื”ื™ื™ืชื™ ืจื•ืฆื” ืœืžืฆื•ื ืกืคืจื™ื™ื” ืขืฆืžืื™ืช. ืื‘ืœ, ื›ืคื™ ืฉื”ืชื‘ืจืจ (ื‘ื‘ื“ื™ืงื” ืจืืฉื•ื ื”), ืื™ ืืคืฉืจ ืœืžืฆื•ื ืกืคืจื™ื•ืช ืจืฆื™ื ื™ื•ืช ื‘ื•ื“ื“ื•ืช. ื›ืœ ืžื” ืฉืงืฉื•ืจ ืœืชื•ืจื™ื ื”ื•ื ืื• ืคืจื•ื™ืงื˜ ืž-3 ืžืชื—ื™ื™ื‘ื™ื ืœืคื ื™ ื—ืžืฉ ืฉื ื™ื, ืื• ืงืฉื•ืจ ืœืžืกื’ืจืช.

ืฉืžืขืชื™ ื”ืจื‘ื” ืขืœ Symfony ื›ืกืคืงื™ืช ืฉืœ ืจื›ื™ื‘ื™ื ืฉื™ืžื•ืฉื™ื™ื ื‘ื•ื“ื“ื™ื, ื•ื›ื‘ืจ ืื ื™ ืžืฉืชืžืฉ ื‘ื—ืœืงื. ื•ื’ื ื›ืžื” ื“ื‘ืจื™ื ืž-Laravel ื™ื›ื•ืœื™ื ืœืฉืžืฉ, ืœืžืฉืœ ื”-ORM ืฉืœื”ื, ืœืœื ื ื•ื›ื—ื•ืช ื”ืžืกื’ืจืช ืขืฆืžื”.

ืกื™ืžืคื•ื ื™ื”/ืžืกื ื’'ืจ

ื”ืžื•ืขืžื“ ื”ืจืืฉื•ืŸ ื ืจืื” ืžื™ื“ ืื™ื“ื™ืืœื™ ื•ืœืœื ื›ืœ ืกืคืง ื”ืชืงื ืชื™ ืื•ืชื•. ืื‘ืœ ื”ืชื‘ืจืจ ืฉืงืฉื” ื™ื•ืชืจ ืœื—ืคืฉ ื‘ื’ื•ื’ืœ ื“ื•ื’ืžืื•ืช ืœืฉื™ืžื•ืฉ ืžื—ื•ืฅ ืœืกื™ืžืคื•ื ื™. ืื™ืš ืœื”ืจื›ื™ื‘ ืžื—ื‘ื•ืจื” ืฉืœ ื›ื™ืชื•ืช ืขื ืฉืžื•ืช ืื•ื ื™ื‘ืจืกืœื™ื™ื ื•ื—ืกืจื™ ืžืฉืžืขื•ืช, ืื•ื˜ื•ื‘ื•ืก ืœื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ื•ืืคื™ืœื• ืขืœ Redis?

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ื”ืชื™ืขื•ื“ ื‘ืืชืจ ื”ืจืฉืžื™ ื”ื™ื” ืžืคื•ืจื˜ ืœืžื“ื™, ืื‘ืœ ื”ืืชื—ื•ืœ ืชื•ืืจ ืจืง ืขื‘ื•ืจ ืกื™ืžืคื•ื ื™ื” ื‘ืืžืฆืขื•ืช YML ื”ืื”ื•ื‘ื™ื ืขืœื™ื”ื ื•ืฉื™ื˜ื•ืช ืงืกื ืื—ืจื•ืช ืขื‘ื•ืจ ื”ืœื-ืกื™ืžืคื•ื ื™ืกื˜. ืœื ื”ื™ื” ืœื™ ืขื ื™ื™ืŸ ื‘ืชื”ืœื™ืš ื”ื”ืชืงื ื” ืขืฆืžื•, ื‘ืžื™ื•ื—ื“ ื‘ื—ื•ืคืฉื•ืช ืจืืฉ ื”ืฉื ื”. ืื‘ืœ ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืขืฉื•ืช ืืช ื–ื” ื‘ืžืฉืš ื–ืžืŸ ืจื‘ ื‘ืื•ืคืŸ ื‘ืœืชื™ ืฆืคื•ื™.

ื”ื ื™ืกื™ื•ืŸ ืœื”ื‘ื™ืŸ ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ืžืขืจื›ืช ื‘ืืžืฆืขื•ืช ืžืงื•ืจื•ืช ืกื™ืžืคื•ื ื™ื” ื”ื™ื ื’ื ืœื ื”ืžืฉื™ืžื” ื”ื˜ืจื™ื•ื•ื™ืืœื™ืช ื‘ื™ื•ืชืจ ืขื‘ื•ืจ ื“ื“ืœื™ื™ืŸ ืงืฆืจ:

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ืื—ืจื™ ืฉื”ืชืขืžืงืชื™ ื‘ื›ืœ ื–ื” ื•ื ื™ืกื™ืชื™ ืœืขืฉื•ืช ืžืฉื”ื• ืขื ื”ื™ื“ื™ื™ื, ื”ื’ืขืชื™ ืœืžืกืงื ื” ืฉืื ื™ ืขื•ืฉื” ืกื•ื’ ืฉืœ ืงื‘ื™ื™ื ื•ื”ื—ืœื˜ืชื™ ืœื ืกื•ืช ืžืฉื”ื• ืื—ืจ.

ืžื•ืืจ/ืชื•ืจ

ื”ืชื‘ืจืจ ืฉื”ืกืคืจื™ื™ื” ื”ื–ื• ื”ื™ื™ืชื” ืงืฉื•ืจื” ื‘ืื•ืคืŸ ื”ื“ื•ืง ืœืชืฉืชื™ืช Laravel ื•ืœืขื•ื“ ื”ืžื•ืŸ ืชืœื•ืช, ืื– ืœื ื”ืฉืงืขืชื™ ื‘ื” ื”ืจื‘ื” ื–ืžืŸ: ื”ืชืงื ืชื™ ืื•ืชื”, ื”ืกืชื›ืœืชื™ ืขืœื™ื”, ืจืื™ืชื™ ืืช ื”ืชืœื•ืช ื•ืžื—ืงืชื™ ืื•ืชื”.

yiisoft/yii2-queue

ื•ื‘ื›ืŸ, ื›ืืŸ ื”ื•ื ื— ืžื™ื“ ืžื”ืฉื, ืฉื•ื‘, ืงืฉืจ ืงืคื“ื ื™ ืœ-Yii2. ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื”ื–ื• ื•ื–ื” ืœื ื”ื™ื” ืจืข, ืื‘ืœ ืœื ื—ืฉื‘ืชื™ ืขืœ ื–ื” ืฉื–ื” ืœื’ืžืจื™ ืชืœื•ื™ ื‘-Yii2.

ื”ืฉืืจ

ื›ืœ ื”ืฉืืจ ืฉืžืฆืืชื™ ื‘-GitHub ื”ื™ื• ืคืจื•ื™ืงื˜ื™ื ืœื ืืžื™ื ื™ื, ืžื™ื•ืฉื ื™ื ื•ื ื˜ื•ืฉื™ื ืœืœื ื›ื•ื›ื‘ื™ื, ืžื–ืœื’ื•ืช ื•ืžืกืคืจ ืจื‘ ืฉืœ ืžื—ื•ื™ื‘ื•ืช.

ื—ื–ืจื” ืœืกื™ืžืคื•ื ื™ื”/ืžืกื ื’'ืจ, ืคืจื˜ื™ื ื˜ื›ื ื™ื™ื

ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืืช ื”ืกืคืจื™ื™ื” ื”ื–ื•, ื•ืื—ืจื™ ืฉื‘ื™ืœื™ืชื™ ืขื•ื“ ื–ืžืŸ, ื”ืฆืœื—ืชื™. ื”ืชื‘ืจืจ ืฉื”ื›ืœ ื”ื™ื” ื“ื™ ืชืžืฆื™ืชื™ ื•ืคืฉื•ื˜. ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ืื•ื˜ื•ื‘ื•ืก, ื™ืฆืจืชื™ ืžืคืขืœ ืงื˜ืŸ, ื›ื™... ื”ื™ื• ืืžื•ืจื™ื ืœื”ื™ื•ืช ืœื™ ื›ืžื” ืฆืžื™ื’ื™ื ื•ืขื ืžื˜ืคืœื™ื ืฉื•ื ื™ื.

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ืจืง ื›ืžื” ืฆืขื“ื™ื:

  • ืื ื• ื™ื•ืฆืจื™ื ืžื˜ืคืœื™ ื”ื•ื“ืขื•ืช ืฉืคืฉื•ื˜ ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ื ื™ืชื ื™ื ืœื”ืชืงืฉืจื•ืช
  • ืื ื• ืขื•ื˜ืคื™ื ืื•ืชื ื‘- HandlerDescriptor (ื›ื™ืชื” ืžื”ืกืคืจื™ื™ื”)
  • ืื ื• ืขื•ื˜ืคื™ื ืืช ื”"ืชื™ืื•ืจื™ื" ื”ืœืœื• ื‘ืžื•ืคืข HandlersLocator
  • ื”ื•ืกืคืช HandlersLocator ืœืžื•ืคืข MessageBus
  • ืื ื• ืžืขื‘ื™ืจื™ื ืงื‘ื•ืฆื” ืฉืœ 'SenderInterface' ืœ-SendersLocator, ื‘ืžืงืจื” ืฉืœื™ ืžืงืจื™ื ืฉืœ ืžื—ืœืงื•ืช 'RedisTransport', ื”ืžื•ื’ื“ืจื•ืช ื‘ืฆื•ืจื” ื‘ืจื•ืจื”
  • ื”ื•ืกืคืช SendersLocator ืœืžื•ืคืข MessageBus

ืœ-MessageBus ื™ืฉ ืฉื™ื˜ื” ืฉืœ โ€‹โ€‹`->dispatch()` ืฉืžื—ืคืฉืช ืืช ื”ืžื˜ืคืœื™ื ื”ืžืชืื™ืžื™ื ื‘- HandlersLocator ื•ืžืขื‘ื™ืจื” ืœื”ื ืืช ื”ื”ื•ื“ืขื”, ืชื•ืš ืฉื™ืžื•ืฉ ื‘-`SenderInterface` ื”ืžืงื‘ื™ืœ ืœืฉืœื™ื—ื” ื“ืจืš ื”ืื•ื˜ื•ื‘ื•ืก (Redis streams).

ื‘ืชืฆื•ืจืช ื”ืžื›ื•ืœื” (ื‘ืžืงืจื” ื–ื” php-di), ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืืช ื›ืœ ื”ื—ื‘ื™ืœื” ื”ื–ื• ื›ืš:

        CONTAINER_REDIS_TRANSPORT_SECRET => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_TRANSPORT_LOG => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_STREAM_RECEIVER_SECRET => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_RECEIVER_LOG => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_BUS => function (ContainerInterface $c) {
            $sendersLocator = new SendersLocator([
                AppMessagesSecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET],
                AppMessagesDaemonLogMessage::class => [CONTAINER_REDIS_TRANSPORT_LOG],
            ], $c);
            $middleware[] = new SendMessageMiddleware($sendersLocator);

            return new MessageBus($middleware);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_SECRET => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'secret',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_LOG => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'log',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },

ื›ืืŸ ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืฉื‘-SendersLocator ื”ืงืฆื™ื ื• "ื˜ืจื ืกืคื•ืจื˜ื™ื" ืฉื•ื ื™ื ืœืฉืชื™ ื”ื•ื“ืขื•ืช ืฉื•ื ื•ืช, ืฉืœื›ืœ ืื—ืช ืžื”ืŸ ื™ืฉ ื—ื™ื‘ื•ืจ ืžืฉืœื” ืœื–ืจืžื™ื ื”ืžืชืื™ืžื™ื.

ืขืฉื™ืชื™ ืคืจื•ื™ืงื˜ ื”ื“ื’ืžื” ื ืคืจื“ ื”ืžื“ื’ื™ื ื™ื™ืฉื•ื ืฉืœ ืฉืœื•ืฉื” ื“ืžื•ื ื™ื ื”ืžืชืงืฉืจื™ื ื–ื” ืขื ื–ื” ื‘ืืžืฆืขื•ืช ื”ืื•ื˜ื•ื‘ื•ืก ื”ื‘ื: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

ืื‘ืœ ืื ื™ ืืจืื” ืœืš ืื™ืš ืืคืฉืจ ืœื‘ื ื•ืช ืฆืจื›ืŸ:

use AppMessagesDaemonLogMessage;
use SymfonyComponentMessengerHandlerHandlerDescriptor;
use SymfonyComponentMessengerHandlerHandlersLocator;
use SymfonyComponentMessengerMessageBus;
use SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
use SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
use SymfonyComponentMessengerTransportSenderSendersLocator;

require_once __DIR__ . '/../vendor/autoload.php';
/** @var PsrContainerContainerInterface $container */
$container = require_once('config/container.php');

$handlers = [
    DaemonLogMessage::class => [
        new HandlerDescriptor(
            function (DaemonLogMessage $m) {
                error_log('DaemonLogHandler: message handled: / ' . $m->getMessage());
            },
            ['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
        )
    ],
];
$middleware = [];
$middleware[] = new HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = new SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = new SendMessageMiddleware($sendersLocator);

$bus = new MessageBus($middleware);
$receivers = [
    CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = new SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();

ืฉื™ืžื•ืฉ ื‘ืชืฉืชื™ืช ื–ื• ื‘ืืคืœื™ืงืฆื™ื”

ืœืื—ืจ ืฉื”ื˜ืžืขืชื™ ืืช ื”ืื•ื˜ื•ื‘ื•ืก ื‘-backend ืฉืœื™, ื”ืคืจื“ืชื™ ืฉืœื‘ื™ื ื‘ื•ื“ื“ื™ื ืžื”ืคืงื•ื“ื” ื”ืกื™ื ื›ืจื•ื ื™ืช ื”ื™ืฉื ื” ื•ื”ื›ื ืชื™ ืžื˜ืคืœื™ื ื ืคืจื“ื™ื, ืฉื›ืœ ืื—ื“ ืžื”ื ืขื•ืฉื” ืืช ืฉืœื•.

ื”ืฆื™ื ื•ืจ ืœื”ื•ืกืคืช ืืชืจ ื—ื“ืฉ ืœืžืกื“ ื”ื ืชื•ื ื™ื ื ืจืื” ื›ืš:

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ื•ืžื™ื“ ืœืื—ืจ ืžื›ืŸ, ื”ื™ื” ืœื™ ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื”ื•ืกื™ืฃ ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื—ื“ืฉื”, ืœืžืฉืœ, ื—ื™ืœื•ืฅ ื•ื ื™ืชื•ื— Rss. ื›ื™ ืชื”ืœื™ืš ื–ื” ื“ื•ืจืฉ ื’ื ืืช ื”ืชื•ื›ืŸ ื”ืžืงื•ืจื™, ื•ืื– ื”ืžื˜ืคืœ ื‘ื—ื™ืœื•ืฅ ืงื™ืฉื•ืจื™ RSS, ื›ืžื• WebsiteIndexHistoryPersistor, ื ืจืฉื ืœื”ื•ื“ืขืช "Content/HtmlContent", ืžืขื‘ื“ ืื•ืชื” ื•ืžืขื‘ื™ืจ ืืช ื”ื”ื•ื“ืขื” ื”ืจืฆื•ื™ื” ืœืื•ืจืš ื”ืฆื™ื ื•ืจ ืฉืœื”.

ื”ืขื‘ืจืช ืงืฆื” ื”-PHP ืœืืคื™ืง ื”ื–ืจืžื™ื ืฉืœ Redis ื•ื‘ื—ื™ืจื” ื‘ืกืคืจื™ื™ื” ืขืฆืžืื™ืช ืžืกื’ืจืช

ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ื”ื’ืขื ื• ืœื›ืžื” ื“ืžื•ื ื™ื, ืฉื›ืœ ืื—ื“ ืžื”ื ืฉื•ืžืจ ืขืœ ืงืฉืจื™ื ืจืง ืœืžืฉืื‘ื™ื ื”ื“ืจื•ืฉื™ื. ืœืžืฉืœ ืฉื“ ืกื•ืจืงื™ื ืžื›ื™ืœ ืืช ื›ืœ ื”ืžื˜ืคืœื™ื ืฉื“ื•ืจืฉื™ื ื›ื ื™ืกื” ืœืื™ื ื˜ืจื ื˜ ืœืชื•ื›ืŸ, ื•ืืช ื”ื“ืžื•ืŸ ืœื”ืชืžื™ื“ ืžื—ื–ื™ืง ื‘ื—ื™ื‘ื•ืจ ืœืžืกื“ ื”ื ืชื•ื ื™ื.

ื›ืขืช, ื‘ืžืงื•ื ืœื‘ื—ื•ืจ ืžืชื•ืš ืžืกื“ ื”ื ืชื•ื ื™ื, ื”ืžื–ื”ื™ื ื”ื ื“ืจืฉื™ื ืœืื—ืจ ื”ื•ืกืคื” ืขืœ ื™ื“ื™ ื”ืžืชืžื™ื“ ืžื•ืขื‘ืจื™ื ืคืฉื•ื˜ ื“ืจืš ื”ืื•ื˜ื•ื‘ื•ืก ืœื›ืœ ื”ืžื˜ืคืœื™ื ื”ืžืขื•ื ื™ื™ื ื™ื ื‘ื›ืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”