αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž”αž»αž–αŸ’αžœαž€αžαžΆ

αž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž…αŸ†αžŽαž„αŸ‹αž…αŸ†αžŽαžΌαž›αž…αž·αžαŸ’αž αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αŸ„αŸ‡αž‚αŸαž αž‘αŸ†αž–αŸαžšαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž“αž·αž„αž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αŸ” αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžαŸ’αž‰αž»αŸ†αž“αŸ…αžŠαžΎαž˜αžŠαŸ†αž”αžΌαž„αž“αŸƒαžŠαŸ†αžŽαžΎαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αžŠαŸ„αž™αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαžαŸ’αž›αž½αž“αž―αž„ αž…αŸ†αžŽαžΌαž›αž…αž·αžαŸ’αž αž“αž·αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž‘αŸ†αž›αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αž½αž€αž‚αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αž˜αžΆαž“αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡αŸ– αž“αŸ…αž›αžΎαžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‚αŸ’αžšαž”αŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžšαž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜ αž“αž·αž„αž˜αž·αž“αž˜αŸ‚αž“αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αžαŸ’αž›αžΆαŸ†αž„ αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αž”αž“αŸ’αžαžšαž€αž˜αžΎαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžΆαžαž€αžαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αž“αž·αž

αž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž‘αŸ†αž–αŸαžš html αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžŠαžΆαž€αŸ‹αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž αžαŸ’αžαž›αŸαžαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈ ul αŸ” αžŠαŸ„αž™αž”αžΆαž“αžœαžΆαž™αž’αžαŸ’αžαž”αž‘αž…αŸ†αž“αž½αž“ 20 αž‘αŸ†αž–αŸαžšαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αž“αŸ„αŸ‡ αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž·αžαžαžΆαžœαžΆαž˜αž·αž“αžŸαžΌαžœαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‘αŸ αž αžΎαž™αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž–αŸ’αž™αžΆαž™αžΆαž˜αž’αŸ’αžœαžΎαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αŸ” αž“αŸ…αž›αžΎ stackoverflow αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αžαžΆαž˜αž“αž»αžŸαŸ’αžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžš parser αž“αŸ…αž€αŸ’αž“αž»αž„ php αžŠαŸ‚αž›αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ„αž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈαžŠαŸ†αž”αžΌαž„ (αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž›αžΎ SO αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡αž‚αžΊαžŠαžΌαž…αž“αŸαŸ‡αŸ– `/users/1` ) αž”αžΆαž“αž‘αžΆαž‰αž™αž€αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΈαžŸαŸ’αž›αžΆαž€αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ SQLite αŸ”

αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž€αŸ†αžŽαŸ‚αž‘αžΈαž–αžΈαžšαŸ– αž”αžŽαŸ’αžαž»αŸ†αž“αŸƒ URLs αžšαžΆαž”αŸ‹αž˜αŸ‰αžΊαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ SQLite αžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ†αž“αž½αžŸαž”αž‰αŸ’αž‡αžΈαž‹αž·αžαž·αžœαž“αŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ HTML αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαŸ’αžœαŸ‚αž„αžšαž€αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸαŸ‡αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž˜αžΆαž“αžαŸ‚ URLs αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž–αž½αž€αžœαžΆαŸ”

αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ„αŸ‡αž”αž„αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡ αž αžΎαž™αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αžœαžΆαžœαž·αž‰αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžšαž™αŸˆαž–αŸαž›αž™αžΌαžšαŸ” αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡ αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž”αžΈαž†αŸ’αž“αžΆαŸ†αž αžΎαž™ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžαžΆαžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαž‡αžΆαž„αž“αŸαŸ‡αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž˜αžΆαž“αž”αŸ†αžŽαž„αž…αž„αŸ‹αž’αŸ’αžœαžΎαž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αž“αŸƒαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžαŸ’αž˜αžΈαŸ—αŸ”

αž€αŸ†αžŽαŸ‚αž‘αŸ†αž“αžΎαž”

αž‚αž˜αŸ’αžšαŸ„αž„ αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Docker αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž‘αŸ… mongoDb αž αžΎαž™αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡ radish αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αžŠαŸ‚αž›αžŠαŸ†αž”αžΌαž„αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž˜αž½αž™αž“αŸƒ PHP microframeworks αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ”

αž”αž‰αŸ’αž αžΆ

αž‚αŸαž αž‘αŸ†αž–αŸαžšαžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αž»αž„αžŸαžΌαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

  • αž‘αžΆαž‰αž™αž€αž˜αžΆαžαž·αž€αžΆαžŠαŸ„αž™ URL
  • αž€αŸ†αžŽαžαŸ‹αž‘αž„αŸ‹αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αžαžΆ HTTPS αž˜αžΆαž“αž¬αž’αžαŸ‹
  • αžšαž€αŸ’αžŸαžΆαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš
  • αž”αŸ’αžšαž—αž– HTML αž“αž·αž„αž”αž‹αž˜αž€αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž”αŸ’αžšαžœαžαŸ’αžαž· "αž€αžΆαžšαž’αŸ’αžœαžΎαž›αž·αž”αž·αž€αŸ’αžšαž˜"
  • αž‰αŸ‚αž€αžαŸ’αž›αžΉαž˜αžŸαžΆαžš αžŠαž€αžŸαŸ’αžšαž„αŸ‹αž…αŸ†αžŽαž„αž‡αžΎαž„ αž“αž·αž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆ
  • αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž”αžŽαŸ’αžαž»αŸ†αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€

αž“αŸαŸ‡αž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‚αŸαž αž‘αŸ†αž–αŸαžš αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αž½αž€αžœαžΆαž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž˜αž½αž™αŸ–

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹ αž“αž·αž„αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„ αžšαž€αŸ’αžŸαžΆαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž±αŸ’αž™αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™ αž˜αž·αž“αžŸαž˜αž›αŸ’αž’αž‘αŸ…αž“αžΉαž„αž‚αŸ†αžšαžΌαž“αŸαŸ‡αž‘αŸαŸ” αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž“αŸ’αžαŸ‚αž˜αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž€αžΌαžŠ αž“αž·αž„αž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ€αžŸαžœαžΆαž„ DDoS αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αŸ”

αž‡αžΆαž‘αžΌαž‘αŸ… αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜ αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αžŽαŸ’αžαžΆαž‰ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ URL αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸαž˜αž·αž“αžŠαŸαž˜αž αž·αž˜αžΆ αž’αž“αž»αžœαžαŸ’αžαž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ URLs αž–αžΈαž”αž‰αŸ’αž‡αžΈαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž–αžΆαž€αŸ’αž™ "αž‡αž½αžš" αžŽαŸ‚αž“αžΆαŸ†αžαŸ’αž›αž½αž“αžœαžΆαž€αŸαžŠαŸ„αž™αŸ” αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‡αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αž“αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αžŠαŸ„αž™αž’αžŸαž˜αž€αžΆαž›αŸ”

αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αž

αž’αž“αž»αžœαžαŸ’αžαž‡αž½αžš αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž‡αŸ†αžšαž»αž‰αžŠαŸ„αž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„ Redis Stream αž‡αžΆαž™αžΌαžšαž˜αž€αž αžΎαž™αŸ”

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ Redis αž“αŸ…αž€αŸ’αž“αž»αž„ PHP

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αžŠαŸ„αž™αžŸαžΆαžšαž€αŸ’αžšαž”αžαžŽαŸ’αžŒαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž™αž€αŸ’αžŸαž‘αžΆαŸ†αž„αž”αžΈ Symfony, Laravel, Yii αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž˜αž½αž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚ αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™ (αž“αŸ…αž›αžΎαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αž”αžΌαž„) αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸαž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαž“αžΈαž˜αž½αž™αŸ—αŸ” αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αžŠαŸ‚αž›β€‹αž‘αžΆαž€αŸ‹β€‹αž‘αž„β€‹αž“αžΉαž„β€‹αž‡αž½αžšβ€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž˜αž½αž™β€‹αž–αžΈ 3 αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžβ€‹αž€αžΆαž›β€‹αž–αžΈβ€‹αž”αŸ’αžšαžΆαŸ†β€‹αž†αŸ’αž“αžΆαŸ†β€‹αž˜αž»αž“ αž¬β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž—αŸ’αž‡αžΆαž”αŸ‹β€‹αž‘αŸ…β€‹αž“αžΉαž„β€‹αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž›αžΊαž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈ Symfony αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž”αž»αž‚αŸ’αž‚αž› αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αž½αž€αžœαžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αžšαž½αž…αž αžΎαž™αŸ” αž αžΎαž™αžœαžαŸ’αžαž»αž˜αž½αž™αž…αŸ†αž“αž½αž“αž–αžΈ Laravel αž€αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž•αž„αžŠαŸ‚αžš αž§αž‘αžΆαž αžšαžŽαŸ ORM αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžαŸ’αž›αž½αž“αž―αž„αŸ”

symfony/messenger

αž”αŸαž€αŸ’αžαž‡αž“αž‘αžΈ XNUMX αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž›αŸ’αž’αž—αŸ’αž›αžΆαž˜αŸ— αž αžΎαž™αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαžŸαž„αŸ’αžŸαŸαž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžœαžΆαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžœαžΆβ€‹αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αž”αžΆαž€β€‹αž‡αžΆαž„β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžΎ Google αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžΎβ€‹αž€αŸ’αžšαŸ… Symfony αŸ” αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž–αžΈαž€αŸ’αžšαž»αž˜αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αž‡αžΆαžŸαž€αž›αž‚αŸ’αž˜αžΆαž“αž“αŸαž™, αž‘αžΆαž“αž€αŸ’αžšαž»αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž“αž·αž„αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž“αŸ…αž›αžΎ Redis?

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž‚αžΊαž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž›αž˜αŸ’αž’αž·αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Symfony αžŠαŸ„αž™αž”αŸ’αžšαžΎ YML αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž…αžΌαž›αž…αž·αžαŸ’αž αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžœαŸαž‘αž˜αž“αŸ’αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αŸ’αž“αž€αž›αŸαž„αž—αŸ’αž›αŸαž„αŸ” αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž‘αŸ αž‡αžΆαž–αž·αžŸαŸαžŸαž€αŸ’αž“αž»αž„αž±αž€αžΆαžŸαž”αž»αžŽαŸ’αž™αž…αžΌαž›αž†αŸ’αž“αžΆαŸ†αžαŸ’αž˜αžΈαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αž’αŸ’αžœαžΎβ€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡β€‹αž€αŸ’αž“αž»αž„β€‹αžšαž™αŸˆβ€‹αž–αŸαž›β€‹αž™αžΌαžšβ€‹αž˜αž·αž“β€‹αž“αžΉαž€β€‹αžŸαŸ’αž˜αžΆαž“β€‹αžŠαž›αŸ‹αŸ”

αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αžšαž€αžœαž·αž’αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž—αŸ’αž›αžΆαž˜αŸ—αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαž—αž– Symfony αž€αŸαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸαžαžΌαž…αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž„αŸƒαž€αŸ†αžŽαžαŸ‹αžŠαŸαžαžΉαž„αžšαŸ‰αžΉαž„αžŠαŸ‚αžšαŸ–

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ„αž™αžŠαŸƒαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“αžαžΆ αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαžˆαžΎαž…αŸ’αžšαžαŸ‹αž˜αž½αž™αž”αŸ’αžšαž—αŸαž‘ αž αžΎαž™αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž”αŸ†αž—αŸ’αž›αžΊ / αž‡αž½αžš

αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™αžαžΆαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž™αŸ‰αžΆαž„αžαžΉαž„αžšαŸ‰αžΉαž„αž‘αŸ…αž“αžΉαž„αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Laravel αž“αž·αž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž•αŸ’αžŸαŸαž„αŸ— αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αž›αžΎαžœαžΆαž‘αŸαŸ– αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžœαžΆ αž˜αžΎαž›αžœαžΆ αžƒαžΎαž‰αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ αž“αž·αž„αž›αž»αž”αžœαžΆαž…αŸ„αž›αŸ”

yiisoft/yii2- αž‡αž½αžš

αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž“αŸ’αž˜αžαŸ‹αž—αŸ’αž›αžΆαž˜αŸ—αž–αžΈαžˆαŸ’αž˜αŸ„αŸ‡, αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αž, αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž™αŸ‰αžΆαž„αžαžΉαž„αžšαžΉαž„αž‘αŸ… Yii2 αŸ” αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž“αŸαŸ‡ αž αžΎαž™αžœαžΆαž˜αž·αž“αž’αžΆαž€αŸ’αžšαž€αŸ‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž›αžΎ Yii2 αž“αŸ„αŸ‡αž‘αŸαŸ”

αž“αŸ…αžŸαž›αŸ‹

αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž›αžΎ GitHub αž‚αžΊαž˜αž·αž“αž’αžΆαž…αž‡αžΏαž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αž αž½αžŸαžŸαž˜αŸαž™ αž“αž·αž„αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž”αž„αŸ‹αž…αŸ„αž›αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž•αŸ’αž€αžΆαž™ αž”αŸ’αžšαž’αž”αŸ‹ αž“αž·αž„αž”αŸ’αžšαžΆαž€αŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αŸ”

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… symfony/messenger, αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸ

αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αžŸαŸ’αžœαŸ‚αž„β€‹αž™αž›αŸ‹β€‹αž–αžΈβ€‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™β€‹αž“αŸαŸ‡ αž αžΎαž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž…αŸ†αžŽαžΆαž™β€‹αž–αŸαž›β€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“β€‹αž‘αŸ€αž αžαŸ’αž‰αž»αŸ†β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž”αžΆαž“αŸ” αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž–αž·αžαž‡αžΆαžŸαž„αŸ’αžαŸαž”αž“αž·αž„αžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž–αž“αŸ’αž›αžΏαž“αž‘αžΆαž“αž€αŸ’αžšαž»αž„ αžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αž€αžΎαžαžšαŸ„αž„αž…αž€αŸ’αžšαžαžΌαž…αž˜αž½αž™ αž–αŸ’αžšαŸ„αŸ‡... αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸβ€‹αžŸαž“αŸ’αž˜αžαŸ‹β€‹αžαžΆβ€‹αž˜αžΆαž“β€‹αžŸαŸ†αž”αž€β€‹αž€αž„αŸ‹β€‹αž‡αžΆβ€‹αž…αŸ’αžšαžΎαž“β€‹αž“αž·αž„β€‹αž‡αžΆαž˜αž½αž™β€‹αžŠαŸƒβ€‹αž€αžΆαž“αŸ‹β€‹αž•αŸ’αžŸαŸαž„β€‹αž‚αŸ’αž“αžΆβ€‹αŸ”

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž–αžΈαžšαž”αžΈαž‡αŸ†αž αžΆαž“αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ–

  • αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαžΆαžš αžŠαŸ‚αž›αž‚αž½αžšαžαŸ‚αž’αžΆαž…αž αŸ…αž”αžΆαž“αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰
  • αž™αžΎαž„αžšαž»αŸ†αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ 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 αž™αžΎαž„αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ "αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“" αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžšαž–αžΈαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαŸ‚αž›αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž“αžΉαž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸƒαžŠαŸαž˜αž·αž“αž”αžΈαžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‘αžΆαž“αž€αŸ’αžšαž»αž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ– 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();

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž½αž™αŸ”

αžŠαŸ„αž™αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‘αžΆαž“αž€αŸ’αžšαž»αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αžΈαž˜αž½αž™αŸ—αž…αŸαž‰αž–αžΈαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ synchronous αž…αžΆαžŸαŸ‹ αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αžŠαŸ‚αž›αž˜αŸ’αž“αžΆαž€αŸ‹αŸ—αž’αŸ’αžœαžΎαžšαžΏαž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αŸ”

αž”αŸ†αž–αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž‚αŸαž αž‘αŸ†αž–αŸαžšαžαŸ’αž˜αžΈαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž αžΎαž™αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈ αž§αž‘αžΆαž αžšαžŽαŸ αž€αžΆαžšαžŸαŸ’αžšαž„αŸ‹αž…αŸαž‰ αž“αž·αž„αž‰αŸ‚αž€ Rss αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αž€αŸαž‘αžΆαž˜αž‘αžΆαžšαž˜αžΆαžαž·αž€αžΆαžŠαžΎαž˜ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαž‰αž™αž€αžαŸ†αžŽ RSS αžŠαžΌαž…αž‡αžΆ WebsiteIndexHistoryPersistor αž‡αžΆαžœαžŸαžΆαžš "αž˜αžΆαžαž·αž€αžΆ / HtmlContent" αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆ αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αžαžΆαž˜αž”αŸ†αž–αž„αŸ‹αžšαž”αžŸαŸ‹αžœαžΆαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ”

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ PHP αž‘αŸ…αž€αžΆαž“αŸ‹ Redis streams bus αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ

αž“αŸ…αž‘αžΈαž”αž‰αŸ’αž…αž”αŸ‹ αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŠαŸαž˜αž·αž“αž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαŸ‚αž›αž“αžΈαž˜αž½αž™αŸ—αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžαŸ‚αž‡αžΆαž˜αž½αž™αž’αž“αž’αžΆαž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž”αž·αžŸαžΆαž… αžŸαžαŸ’αžœαž›αžΌαž“αžœαžΆαžš αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΆαžαž·αž€αžΆ αž“αž·αž„αžŠαŸαž˜αž·αž“ αž”αž“αŸ’αž αž˜αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αžŠαŸ„αž™αž’αŸ’αž“αž€αžαžŸαŸŠαžΌαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αžαžΆαž˜αžšαž™αŸˆαž‘αžΆαž“αž€αŸ’αžšαž»αž„αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹