เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เบ„เปเบฒเบญเบฐเบ—เบดเบ–เบฒเบ™

เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ—เบตเปˆเบ‚เป‰เบญเบเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบงเบฝเบเบญเบฐเบ”เบดเป€เบฅเบ, เบ–เบทเบเบญเบญเบเปเบšเบšเบกเบฒเป€เบžเบทเปˆเบญเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบšเบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบฅเบฐเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™. เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เป€เบฅเบตเปˆเบกเบชเบปเบ™เปƒเบˆเบ‚เป‰เบญเบเปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบ”เบตเบ™เบ—เบฒเบ‡เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ‚เบญเบ‡เบ‚เป‰เบญเบ; เปƒเบ™เบ‚เบฐเบ™เบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบฎเบนเป‰เบชเบถเบเบ›เบฐเบ—เบฑเบšเปƒเบˆเบเบฑเบšเบเบฒเบ™เบŠเบญเบเบซเบฒเบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเป€เบญเบ‡, เบงเบฝเบเบญเบฐเบ”เบดเป€เบฅเบเปเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบ™เบดเป„เบชเบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบžเบงเบเบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบญเบ‡เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเบˆเบปเบ™เป€เบ–เบดเบ‡เบ—เบธเบเบงเบฑเบ™เบ™เบตเป‰: เปƒเบ™เป€เบเบทเบญเบšเบ—เบธเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบเบฒเบ™เบ„เป‰เบฒเปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบ„เป‰เบฒเบซเบผเบฒเบ, เบ‚เป‰เบญเบเบชเบทเบšเบ•เปเปˆเบŠเบญเบเบซเบฒเบขเบนเปˆเปƒเบ™เบชเปˆเบงเบ™เบ—เป‰เบฒเบเป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบœเบนเป‰เบ‚เบฝเบ™.

เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”

เบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เป‰เบฒ html เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเปˆเบงเบ™เบ•เบปเบงเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบšเปˆเบญเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบชเปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบกเบตเบฅเบฒเบเป€เบŠเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ ul. เบกเบตเบเบฒเบ™เบžเบดเบก 20 เบซเบ™เป‰เบฒเปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒ, เบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบ„เบดเบ”เบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเปเบฅเบฐเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบžเบฐเบเบฒเบเบฒเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เปƒเบ™ stackoverflow, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบ›เบฐเบŠเบฒเบŠเบปเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเปƒเบ™เป‚เบ›เบฃเป„เบŸเบฅเปŒเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เบฝเบ™ parser เปƒเบ™ php, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเป„เบ›เป‚เบ”เบเบœเปˆเบฒเบ™เป‚เบ›เบฃเป„เบŸเบฅเปŒ, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ—เปเบฒเบญเบดเบ” (เบ—เบตเปˆเบขเบนเปˆ SO เบˆเบปเบ™เป€เบ–เบดเบ‡เบ—เบธเบเบกเบทเป‰เบ™เบตเป‰เป€เบ›เบฑเบ™เปเบšเบšเบ™เบตเป‰: `/users/1`. ), เบชเบฐเบเบฑเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบˆเบฒเบเปเบ—เบฑเบเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบฅเบฐเป€เบžเบตเปˆเบกเบกเบฑเบ™เปƒเบ™ SQLite.

เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบชเบฐเบšเบฑเบšเบ—เบตเบชเบญเบ‡: เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบซเบฅเบฒเบเบชเบดเบšเบžเบฑเบ™ URL เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ SQLite, เป€เบŠเบดเปˆเบ‡เปเบ—เบ™เบ—เบตเปˆเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ„เบปเบ‡เบ—เบตเปˆเปƒเบ™ HTML. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ„เบปเป‰เบ™เบซเบฒเปเบšเบšเบ‡เปˆเบฒเบเป†เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ™เบตเป‰. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบกเบตเบžเบฝเบ‡เปเบ•เปˆ URLs, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบญเบตเบ‡เปƒเบชเปˆเบžเบงเบเบกเบฑเบ™.

เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเบ–เบดเป‰เบกเป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบกเบฑเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, เบ›เบฐเบชเบปเบšเบเบฒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเบชเบฒเบกเบ›เบตเปเบฅเป‰เบงเปเบฅเบฐเบ‚เป‰เบญเบเบฎเบนเป‰เบชเบถเบเบงเปˆเบฒเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบเบงเปˆเบฒเป€เบเบปเปˆเบฒ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบตเบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเปœเบฒเบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปƒเบซเบกเปˆ.

เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก

เป‚เบ„เบ‡เบเบฒเบ™ deployed เปƒเบ™ Docker, เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบ–เบทเบเป‚เบญเบ™เป„เบ› mongoDb, เปเบฅเบฐเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, radish เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰. เบซเบ™เบถเปˆเบ‡เปƒเบ™ microframeworks PHP เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™.

เบšเบฑเบ™เบซเบฒ

เป€เบงเบฑเบšเป„เบŠเบ—เปŒเปƒเบซเบกเปˆเบ–เบทเบเป€เบžเบตเปˆเบกเป‚เบ”เบเบ„เปเบฒเบชเบฑเปˆเบ‡ console เบ—เบตเปˆ synchronously เป€เบฎเบฑเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบ”เบฒเบงเป‚เบซเบผเบ”เป€เบ™เบทเป‰เบญเบซเบฒเป‚เบ”เบ URL
  • เบ•เบฑเป‰เบ‡เบ—เบธเบ‡เบŠเบตเป‰เบšเบญเบเบงเปˆเบฒ HTTPS เบกเบตเบขเบนเปˆเบซเบผเบทเบšเปเปˆ
  • เบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ
  • เปเบซเบผเปˆเบ‡ HTML เปเบฅเบฐเบชเปˆเบงเบ™เบซเบปเบงเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ” "เบ”เบฑเบ”เบชเบฐเบ™เบต".
  • เบงเบดเป€เบ„เบฒเบฐเป€เบ™เบทเป‰เบญเบซเบฒ, เปเบเบเบŠเบทเปˆ เปเบฅเบฐเบ„เบณเบญเบฐเบ—เบดเบšเบฒเบ
  • เบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ„เปเป€เบฅเบฑเบเบŠเบฑเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ

เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบžเบฝเบ‡เปเบ•เปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป€เบงเบฑเบšเป„เบŠเบ—เปŒเปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ:

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เปเบ•เปˆเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบเบฒเบ™เบˆเบฑเบ”เบ›เบฐเป€เบžเบ”เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบฎเบฑเบเบชเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปƒเบซเป‰เบ—เบฑเบ™เบชเบฐเป„เบซเบก, เบšเปเปˆเป„เบ”เป‰เป€เบซเบกเบฒเบฐเบเบฑเบš paradigm เบ™เบตเป‰. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเป€เบžเบตเปˆเบกเบงเบดเบ—เบตเบเบฒเบ™เป€เบงเบฑเบšเป„เบŠเบ•เปŒเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบซเบ™เป‰เบฒเบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™ DDoS เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เปเบ™เปˆเบ™เบญเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰ synchronously, เปเบฅเบฐเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบ—เบถเบ URL เป€เบžเบทเปˆเบญเปƒเบซเป‰ daemon monstrous เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบš URLs เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ„เปเบฒเบงเปˆเบฒ "เปเบ–เบง" เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เปเบฅเบฐเบ–เป‰เบฒเบ„เบดเบงเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบญเบญเบเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ asynchronously.

เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆ

เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบดเบงเปเบฅเบฐเบชเป‰เบฒเบ‡เบฅเบฐเบšเบปเบšเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. เปเบฅเบฐเบ‚เป‰เบญเบเบขเบฒเบเบฅเบญเบ‡ Redis Stream เบกเบฒเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เปเบฅเป‰เบง.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Redis streams เปƒเบ™ PHP

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบญเบšเบ‚เบญเบ‡เบ‚เป‰เบญเบเบšเปเปˆเปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบฒเบกเบเบฑเบเปƒเบซเบเปˆ Symfony, Laravel, Yii, เบ‚เป‰เบญเบเบขเบฒเบเบŠเบญเบเบซเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบญเบเบฐเบฅเบฒเบ”. เปเบ•เปˆ, เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบซเบฑเบ™เบญเบญเบ (เปƒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”), เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบŠเบญเบเบซเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบ‚เบญเบ‡เบšเบธเบเบ„เบปเบ™. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ„เบดเบงเปเบกเปˆเบ™เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบ 3 commits เบซเป‰เบฒเบ›เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบซเบผเบทเบ–เบทเบเบœเบนเบเบกเบฑเบ”เบเบฑเบšเบเบญเบš.

เบ‚เป‰เบญเบเป„เบ”เป‰เบเบดเบ™เบซเบผเบฒเบเบเปˆเบฝเบงเบเบฑเบš Symfony เป€เบ›เบฑเบ™เบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡เบชเปˆเบงเบ™เบ›เบฐเบเบญเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™, เปเบฅเบฐเบ‚เป‰เบญเบเปƒเบŠเป‰เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เปเบฅเป‰เบง. เปเบฅเบฐเบšเบฒเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฒเบ Laravel เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡ ORM เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบกเบตเบเบญเบšเบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡.

symfony/messenger

เบœเบนเป‰เบชเบฐเบซเบกเบฑเบเบ—เปเบฒเบญเบดเบ”เบ—เบฑเบ™เบ—เบตเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบซเบกเบฒเบฐเบชเบปเบกเปเบฅเบฐเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบปเบ‡เปƒเบชเปƒเบ”เป†เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™. เปเบ•เปˆเบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบ•เปเปˆเบเบฑเบš google เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ™เบญเบ Symfony. เบงเบดเบ—เบตเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบˆเบฒเบเบเบธเปˆเบกเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ—เบปเปˆเบงเป„เบ›, เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบ, เบฅเบปเบ”เป€เบกเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡ Redis?

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เป€เบญเบเบฐเบชเบฒเบ™เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบฒเบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบฅเบฐเบญเบฝเบ”, เปเบ•เปˆเบงเปˆเบฒเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเบชเปเบฒเบฅเบฑเบš Symfony เป‚เบ”เบเปƒเบŠเป‰ YML เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบกเบฑเบเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™ magic เบญเบทเปˆเบ™เป†เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบ”เบปเบ™เบ•เบตเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ symphonist. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เบŠเปˆเบงเบ‡เบงเบฑเบ™เบžเบฑเบเบ›เบตเปƒเบซเบกเปˆ. เปเบ•เปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบ—เบตเปˆเบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”.

เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบซเบฒเบงเบดเบ—เบตเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบšเบปเบšเบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”เป‚เบ”เบเปƒเบŠเป‰เปเบซเบผเปˆเบ‡ Symfony เบšเปเปˆเปเบกเปˆเบ™เบงเบฝเบเบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเป€เบชเบฑเป‰เบ™เบ•เบฒเบเบ—เบตเปˆเป€เบ„เบฑเปˆเบ‡เบ„เบฑเบ”:

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เบซเบผเบฑเบ‡เบˆเบฒเบ delving เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ”เป‰เบงเบเบกเบทเบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบกเบฒเบชเบฐเบซเบฅเบธเบšเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบฎเบฑเบ”เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ crutches เปเบฅเบฐเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบญเบฑเบ™เบญเบทเปˆเบ™.

illuminated/เบ„เบดเบง

เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบงเปˆเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ™เบตเป‰เบ•เบดเบ”เปเบซเบ™เป‰เบ™เบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ Laravel เปเบฅเบฐเบ„เบงเบฒเบกเป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเบญเบทเปˆเบ™เป†, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบเบฑเบšเบกเบฑเบ™: เบ‚เป‰เบญเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™, เป€เบšเบดเปˆเบ‡เบกเบฑเบ™, เป€เบซเบฑเบ™เบ„เบงเบฒเบกเป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเปเบฅเบฐเบฅเบถเบšเบกเบฑเบ™เบญเบญเบ.

yiisoft/yii2-queue

เบ”เบต, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบชเบปเบกเบกเบธเบ”เบ—เบฑเบ™เบ—เบตเบˆเบฒเบเบŠเบทเปˆ, เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบ„เบฑเปˆเบ‡เบ„เบฑเบ”เบเบฑเบš Yii2. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ™เบตเป‰เปเบฅเบฐเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบ”เบต, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบกเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบš Yii2 เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™.

เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญ

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบžเบปเบšเปƒเบ™ GitHub เปเบกเปˆเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบท, เบฅเป‰เบฒเบชเบฐเป„เบซเบกเปเบฅเบฐเบ–เบทเบเบ›เบฐเบ–เบดเป‰เบกเป„เบงเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบฎเบนเบšเบ”เบฒเบง, เบชเป‰เบญเบกเปเบฅเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ.

เบเบฑเบšเป„เบ›เบ—เบตเปˆ symfony/messenger, เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบ„เบดเบ”โ€‹เบญเบญเบโ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เบ™เบตเป‰โ€‹เปเบฅเบฐโ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบซเบผเบฒเบโ€‹เบเบงเปˆเบฒโ€‹, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบฎเบฑเบ”โ€‹เป„เบ”เป‰โ€‹. เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡ concise เปเบฅเบฐเบ‡เปˆเบฒเบเบ”เบฒเบ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบปเบ”เป€เบกเบ—เบฑเบ™เบ—เบต, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เป‚เบฎเบ‡เบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ ... เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เบกเบตโ€‹เบขเบฒเบ‡โ€‹เบฅเบปเบ”โ€‹เบซเบผเบฒเบโ€‹เปเบฅเบฐโ€‹เบกเบต handlers เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™.

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบชเบฒเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  • เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเป„เบ”เป‰เบ‡เปˆเบฒเบเป†
  • เบžเบงเบเป€เบฎเบปเบฒเบซเปเปˆเบžเบงเบเบกเบฑเบ™เป„เบงเป‰เปƒเบ™ HandlerDscriptor (เบซเป‰เบญเบ‡เบฎเบฝเบ™เบˆเบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”)
  • เบžเบงเบเป€เบฎเบปเบฒเบซเปเปˆ "เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบ" เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ HandlersLocator
  • เบเบฒเบ™เป€เบžเบตเปˆเบก HandlersLocator เปƒเบชเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡ MessageBus
  • เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบŠเบธเบ”เบ‚เบญเบ‡ 'SenderInterface' เปƒเบซเป‰เบเบฑเบš SenderLocator, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ 'RedisTransport', เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เบ—เบฒเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™.
  • เบเบฒเบ™เป€เบžเบตเปˆเบก SenderLocator เปƒเบชเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡ MessageBus

MessageBus เบกเบตเบงเบดเบ—เบตเบเบฒเบ™ `-> dispatch()` เบ—เบตเปˆเบŠเบญเบเบซเบฒเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปƒเบ™ HandlersLocator เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒ, เป‚เบ”เบเปƒเบŠเป‰ `SenderInterface` เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เบฅเบปเบ”เป€เบก (เบชเบฒเบ Redis).

เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰ 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);
        },

เบ—เบตเปˆเบ™เบตเป‰เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒเปƒเบ™ SenderLocator เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบกเบญเบšเบซเบกเบฒเบ "เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡" เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบชเบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบเบฑเบšเบชเบฒเบเบ™เป‰เปเบฒเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™ demo เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบชเบฒเบก daemons เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบฅเบปเบ”เป€เบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰: 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 เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ‚เป‰เบญเบเปเบเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบšเบธเบเบ„เบปเบ™เบญเบญเบเบˆเบฒเบเบ„เปเบฒเบชเบฑเปˆเบ‡ synchronous เป€เบเบปเปˆเบฒเปเบฅเบฐเบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡.

เบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบงเบฑเบšเป„เบŠเบ—เปŒเปƒเบซเบกเปˆเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เปเบฅเบฐเบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบซเบ™เป‰เบฒเบ—เบตเปˆเปƒเบซเบกเปˆ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบชเบฐเบเบฑเบ”เปเบฅเบฐเปเบเบ Rss. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ™เบทเป‰เบญเบซเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ RSS link extractor handler, เป€เบŠเบฑเปˆเบ™ WebsiteIndexHistoryPersistor, เบˆเบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก "Content/HtmlContent", เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบกเบฑเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบฒเบกเบ—เปเปˆเบ‚เบญเบ‡เบกเบฑเบ™เบ•เบทเปˆเบกเบญเบตเบ.

เบเบฒเบ™เป‚เบญเบ™ backend PHP เบเบฑเบš Redis streams bus เปเบฅเบฐเป€เบฅเบทเบญเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” framework-เป€เบญเบเบฐเบฅเบฒเบ”

เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เบžเบงเบเป€เบฎเบปเบฒเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เบ”เป‰เบงเบ daemon เบซเบผเบฒเบ, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบฎเบฑเบเบชเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบœเบตเบ›เบตเบชเบฒเบ” เบ•เบปเบงเบเบงเบฒเบ”เป€เบงเบฑเบš เบ›เบฐเบเบญเบšเบกเบตเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เป„เบ›เบซเบฒเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบชเปเบฒเบฅเบฑเบšเป€เบ™เบทเป‰เบญเบซเบฒ, เปเบฅเบฐ daemon เบ„เบปเบ‡เบขเบนเปˆ เบ–เบทเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบทเบญเบเบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, ids เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เปƒเบชเปˆเป‚เบ”เบ persister เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เบฅเบปเบ”เป€เบกเป„เบ›เบซเบฒเบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบชเบปเบ™เปƒเบˆเบ—เบฑเบ‡เบซเบกเบปเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™