ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

ΠΏΡ€Π΅Π΄Π³ΠΎΠ²ΠΎΡ€ΠΎΡ‚

ΠœΠΎΡ˜Π°Ρ‚Π° Π²Π΅Π±-страница, која ја Π²ΠΎΠ΄Π°ΠΌ ΠΊΠ°ΠΊΠΎ Ρ…ΠΎΠ±ΠΈ, Π΅ Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½Π° Π΄Π° Π±ΠΈΠ΄Π΅ домаќин Π½Π° интСрСсни ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΈ страници ΠΈ Π»ΠΈΡ‡Π½ΠΈ страници. Оваа Ρ‚Π΅ΠΌΠ° ΠΏΠΎΡ‡Π½Π° Π΄Π° ΠΌΠ΅ интСрСсира Π½Π° самиот ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ Π½Π° ΠΌΠΎΠ΅Ρ‚ΠΎ програмско ΠΏΠ°Ρ‚ΡƒΠ²Π°ΡšΠ΅; Π²ΠΎ Ρ‚ΠΎΡ˜ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±Π΅Π² фасциниран ΠΎΠ΄ Π½Π°ΠΎΡ“Π°ΡšΠ΅Ρ‚ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ профСсионалци ΠΊΠΎΠΈ ΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ Π·Π° сСбС, Π·Π° своитС Ρ…ΠΎΠ±ΠΈ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ. Навиката Π΄Π° Π³ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΠΌ Π·Π° сСбС останува Π΄ΠΎ Π΄Π΅Π½-дСнСс: Π½Π° рСчиси сСкоја ΠΊΠΎΠΌΠ΅Ρ€Ρ†ΠΈΡ˜Π°Π»Π½Π° ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠΌΠ΅Ρ€Ρ†ΠΈΡ˜Π°Π»Π½Π° страница, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΠΌ Π΄Π° Π³Π»Π΅Π΄Π°ΠΌ Π²ΠΎ ΠΏΠΎΠ΄Π½ΠΎΠΆΡ˜Π΅Ρ‚ΠΎ Π²ΠΎ ΠΏΠΎΡ‚Ρ€Π°Π³Π° ΠΏΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ Π΄ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅.

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π°

ΠŸΡ€Π²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° бСшС само html страница Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° Π»ΠΈΡ‡Π½Π° Π²Π΅Π±-страница, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ставам врски со потписи Π²ΠΎ ΡƒΠ» листа. ΠžΡ‚ΠΊΠ°ΠΊΠΎ напишав 20 страници Π²ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ врСмСнски ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, ΠΏΠΎΡ‡Π½Π°Π² Π΄Π° мислам Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Сфикасно ΠΈ Ρ€Π΅ΡˆΠΈΠ² Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° Π³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌ процСсот. На stackoverflow, Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π² Π΄Π΅ΠΊΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π»ΡƒΡ“Π΅ посочуваат ΡΠ°Ρ˜Ρ‚ΠΎΠ²ΠΈ Π²ΠΎ Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ, ΠΏΠ° напишав парсСр Π²ΠΎ php, кој Сдноставно ΠΏΠΎΠΌΠΈΠ½Π° Π½ΠΈΠ· ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΎΠ΄ ΠΏΡ€Π²ΠΈΠΎΡ‚ (адрСситС Π½Π° SO Π΄ΠΎ дСнСс сС Π²Π°ΠΊΠ°: `/users/1` ), ΠΈΠ·Π²Π°Π΄ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ ΠΎΠ΄ саканата ΠΎΠ·Π½Π°ΠΊΠ° ΠΈ ја Π΄ΠΎΠ΄Π°Π΄Π΅ Π²ΠΎ SQLite.

Ова ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π°: Π·Π±ΠΈΡ€ΠΊΠ° ΠΎΠ΄ дСсСтици илјади URL-адрСси Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π° SQLite, која ја Π·Π°ΠΌΠ΅Π½ΠΈ статичната листа Π²ΠΎ html. Направив Сдноставно ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°Π° листа. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ имашС само URL-адрСси, Ρ‚ΠΎΠ³Π°Ρˆ ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Сдноставно сС Π±Π°Π·ΠΈΡ€Π°ΡˆΠ΅ Π½Π° Π½ΠΈΠ².

Π’ΠΎ ΠΎΠ²Π°Π° Ρ„Π°Π·Π° Π³ΠΎ Π½Π°ΠΏΡƒΡˆΡ‚ΠΈΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΠΈ сС Π²Ρ€Π°Ρ‚ΠΈΠ² Π½Π° Π½Π΅Π³ΠΎ ΠΏΠΎ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅. Π’ΠΎ ΠΎΠ²Π°Π° Ρ„Π°Π·Π°, ΠΌΠΎΠ΅Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π½ΠΎ искуство бСшС вСќС повСќС ΠΎΠ΄ Ρ‚Ρ€ΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ чувствував Π΄Π΅ΠΊΠ° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Π½Π΅ΡˆΡ‚ΠΎ посСриозно. ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, имашС Π³ΠΎΠ»Π΅ΠΌΠ° ΠΆΠ΅Π»Π±Π° Π΄Π° сС совладаат Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ Π½ΠΎΠ²ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.

ΠœΠΎΠ΄Π΅Ρ€Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π°

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ распорСдСна Π²ΠΎ Docker, Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ бСшС ΠΏΡ€Π΅Ρ„Ρ€Π»Π΅Π½Π° Π½Π° mongoDb, Π° Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° бСшС Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° ΠΈ Ρ€ΠΎΡ‚ΠΊΠ²ΠΈΡ†Π°, која Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ бСшС само Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°ΡšΠ΅. Како основа сС користи Π΅Π΄Π½Π° ΠΎΠ΄ ΠΌΠΈΠΊΡ€ΠΎΡ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° PHP.

ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

НовитС Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ сС Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ‚ со ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° која синхроно Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ слСдново:

  • ΠŸΡ€Π΅Π·Π΅ΠΌΠ° содрТина ΠΏΠΎ URL
  • ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π° Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅ ΡˆΡ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° Π΄Π°Π»ΠΈ HTTPS Π±ΠΈΠ» достапСн
  • Ја Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° ΡΡƒΡˆΡ‚ΠΈΠ½Π°Ρ‚Π° Π½Π° Π²Π΅Π±-страницата
  • Π˜Π·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ HTML ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΡ˜Π°Ρ‚Π° сС Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΈ Π²ΠΎ ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° β€žΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€Π°ΡšΠ΅β€œ.
  • Анализира содрТина, Скстракти Наслов ΠΈ опис
  • Π—Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ посСбна ΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΡ˜Π°

Ова бСшС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Сдноставно Π΄Π° сС складираат ΡΠ°Ρ˜Ρ‚ΠΎΠ²ΠΈΡ‚Π΅ ΠΈ Π΄Π° сС ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ°Ρ‚ Π²ΠΎ список:

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

Но, ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π° автоматско ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€Π°ΡšΠ΅, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ ΠΈ Ρ€Π°Π½Π³ΠΈΡ€Π°ΡšΠ΅ Π½Π° сè, ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° сè Π²ΠΎ Ρ‚Π΅ΠΊ, Π½Π΅ сС Π²ΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡˆΠ΅ Π΄ΠΎΠ±Ρ€ΠΎ Π²ΠΎ ΠΎΠ²Π°Π° ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ°. Π”ΡƒΡ€ΠΈ ΠΈ Сдноставното додавањС Π²Π΅Π±-ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° додавањС страници Π±Π°Ρ€Π° Π΄ΡƒΠΏΠ»ΠΈΡ€Π°ΡšΠ΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΡ˜Π°Π»Π΅Π½ DDoS.

Π’ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, сè ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ синхроно, Π° Π²ΠΎ Π²Π΅Π±-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Сдноставно Π΄Π° Π³ΠΎ Π·Π°Ρ‡ΡƒΠ²Π°Ρ‚Π΅ URL-Ρ‚ΠΎ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Ρ‡ΡƒΠ΄ΠΎΠ²ΠΈΡˆΠ½ΠΈΠΎΡ‚ Π΄Π΅ΠΌΠΎΠ½ Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ситС Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° URL-адрСситС ΠΎΠ΄ списокот. Но, сСпак, Π΄ΡƒΡ€ΠΈ ΠΈ ΠΎΠ²Π΄Π΅ Π·Π±ΠΎΡ€ΠΎΡ‚ β€žΡ€Π΅Π΄ΠΈΡ†Π°β€œ сС сугСрира. И Π°ΠΊΠΎ сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° Ρ€Π΅Π΄ΠΈΡ†Π°, Ρ‚ΠΎΠ³Π°Ρˆ ситС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ΄Π΅Π»Π°Ρ‚ ΠΈ Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠ°Ρ‚ Π±Π°Ρ€Π΅ΠΌ асинхроно.

РСшСниС

Π‘ΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ€Π΅Π΄ΠΈΡ†ΠΈ ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈ систСм ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π½ ΠΎΠ΄ настани Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ситС Π·Π°Π΄Π°Ρ‡ΠΈ. И Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ сакам Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ±Π°ΠΌ Redis Streams.

ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° стримови Π½Π° Redis Π²ΠΎ PHP

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΌΠΎΡ˜Π°Ρ‚Π° Ρ€Π°ΠΌΠΊΠ° Π½Π΅ Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Ρ‚Ρ€ΠΈΡ‚Π΅ Π³ΠΈΠ³Π°Π½Ρ‚ΠΈ Symfony, Laravel, Yii, Π±ΠΈ сакал Π΄Π° најдам нСзависна Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Но, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС испостави (Π½Π° ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΈΡΠΏΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅), Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС Π½Π°Ρ˜Π΄Π°Ρ‚ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»Π½ΠΈ сСриозни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘Γ¨ ΡˆΡ‚ΠΎ Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΎ со Ρ€Π΅Π΄ΠΈΡ†ΠΈΡ‚Π΅ Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ΄ 3 commit ΠΏΡ€Π΅Π΄ ΠΏΠ΅Ρ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΈΠ»ΠΈ Π΅ Π²Ρ€Π·Π°Π½ΠΎ Π·Π° Ρ€Π°ΠΌΠΊΠ°Ρ‚Π°.

Π‘Π»ΡƒΡˆΠ½Π°Π² ΠΌΠ½ΠΎΠ³Ρƒ Π·Π° Symfony ΠΊΠ°ΠΊΠΎ снабдувач Π½Π° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ корисни ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΈ вСќС користам Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ Π½ΠΈΠ². А исто Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС користат ΠΈ Π½Π΅ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΠ΄ Laravel, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠ²Π½Π°Ρ‚Π° ORM, Π±Π΅Π· присуство Π½Π° самата Ρ€Π°ΠΌΠΊΠ°.

ΡΠΈΠΌΡ„ΠΎΠ½ΠΈΡ˜Π°/гласник

ΠŸΡ€Π²ΠΈΠΎΡ‚ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ вСднаш ΠΌΠΈ сС Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΠΈ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ сомнСвањС Π³ΠΎ инсталирав. Но, сС ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π΅ ΠΏΠΎΡ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС ΠΏΡ€ΠΎΠ³ΡƒΠ³Π»Π°Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Symfony. Како Π΄Π° сС состави автобус Π·Π° ΠΏΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΎΠ΄ ΠΊΡƒΠΏ часови со ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·Π°Π»Π½ΠΈ, бСсмислСни имиња, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ Π½Π° РСдис?

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° страница бСшС доста Π΄Π΅Ρ‚Π°Π»Π½Π°, Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° бСшС опишана само Π·Π° Symfony ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΈ Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΎΠΌΠΈΠ»Π΅Π½ΠΈ YML ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ°Π³ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° нСсимфонистот. НСмав Π½ΠΈΠΊΠ°ΠΊΠΎΠ² интСрСс Π·Π° самиот процСс Π½Π° ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π°, особСно Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π·Π½ΠΈΡ†ΠΈ. Но, ΠΌΠΎΡ€Π°Π² Π΄Π° Π³ΠΎ ΠΏΡ€Π°Π²Π°ΠΌ ΠΎΠ²Π° Π½Π΅ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅.

ΠžΠ±ΠΈΠ΄ΠΎΡ‚ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° исконструиратС систСм ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΈΠ·Π²ΠΎΡ€ΠΈ Π½Π° Symfony, исто Ρ‚Π°ΠΊΠ°, Π½Π΅ Π΅ Π½Π°Ρ˜Ρ‚Ρ€ΠΈΠ²ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π·Π° тСсСн Ρ€ΠΎΠΊ:

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

ΠžΡ‚ΠΊΠ°ΠΊΠΎ Π½Π°Π²Π»Π΅Π³ΡƒΠ²Π°Π² Π²ΠΎ сСто ΠΎΠ²Π° ΠΈ сС ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Π½Π΅ΡˆΡ‚ΠΎ со Ρ€Π°Ρ†Π΅Ρ‚Π΅, дојдов Π΄ΠΎ Π·Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ Π΄Π΅ΠΊΠ° ΠΏΡ€Π°Π²Π°ΠΌ Π½Π΅ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ ΠΈ Ρ€Π΅ΡˆΠΈΠ² Π΄Π° ΠΏΡ€ΠΎΠ±Π°ΠΌ Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ.

освСтлСна/Ρ€Π΅Π΄ΠΈΡ†Π°

Π‘Π΅ испостави Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΅ цврсто ΠΏΠΎΠ²Ρ€Π·Π°Π½Π° со инфраструктурата Π½Π° Π›Π°Ρ€Π°Π²Π΅Π» ΠΈ Π΅Π΄Π΅Π½ ΠΊΡƒΠΏ Π΄Ρ€ΡƒΠ³ΠΈ зависности, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ ΠΏΠΎΡ‚Ρ€ΠΎΡˆΠΈΠ² ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π½Π΅Π°: ја инсталирав, ја ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π², Π³ΠΈ Π²ΠΈΠ΄ΠΎΠ² зависноститС ΠΈ ја ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π².

yiisoft/yii2-Ρ€Π΅Π΄ΠΈΡ†Π°

Па, Ρ‚ΡƒΠΊΠ° вСднаш сС ΠΏΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡˆΠ΅ ΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, строга врска со Yii2. ΠœΠΎΡ€Π°Π² Π΄Π° ја користам ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Π½Π΅ бСшС лоша, Π½ΠΎ Π½Π΅ размислував Π·Π° Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° цСлосно зависи ΠΎΠ΄ Yii2.

ΠžΡΡ‚Π°Ρ‚ΠΎΠΊΠΎΡ‚

Π‘Γ¨ Π΄Ρ€ΡƒΠ³ΠΎ ΡˆΡ‚ΠΎ Π³ΠΎ најдов Π½Π° GitHub Π±Π΅Π° нСсигурни, застарСни ΠΈ Π½Π°ΠΏΡƒΡˆΡ‚Π΅Π½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π±Π΅Π· Ρ•Π²Π΅Π·Π΄ΠΈ, Π²ΠΈΠ»ΡƒΡˆΠΊΠΈ ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Π½Π° обврски.

Π’Ρ€Π°Ρ‚ΠΈ сС Π½Π° ΡΠΈΠΌΡ„ΠΎΠ½ΠΈΡ˜Π°/ΠΌΠ΅ΡΠΈΠ½ΡŸΠ΅Ρ€, Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ

ΠœΠΎΡ€Π°Π² Π΄Π° ја сфатам ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ, ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Π² ΡƒΡˆΡ‚Π΅ ΠΌΠ°Π»ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅, успСав. Π‘Π΅ испостави Π΄Π΅ΠΊΠ° сè Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ΠΊΠΎΠ½Ρ†ΠΈΠ·Π½ΠΎ ΠΈ Сдноставно. Π—Π° Π΄Π° Π³ΠΎ инстанцирам автобусот, Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² ΠΌΠ°Π»Π° Ρ„Π°Π±Ρ€ΠΈΠΊΠ°, бидСјќи ... Π’Ρ€Π΅Π±Π°ΡˆΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³ΡƒΠΌΠΈ ΠΈ со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈ.

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови 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();

ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΎΠ²Π°Π° инфраструктура Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ја ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π² магистралата Π²ΠΎ ΠΌΠΎΡ˜ΠΎΡ‚ Π·Π°Π΄Π΅Π½ Π΄Π΅Π», Π³ΠΈ ΠΎΠ΄Π΄Π΅Π»ΠΈΠ² ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈΡ‚Π΅ Ρ„Π°Π·ΠΈ ΠΎΠ΄ старата синхрона ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ² посСбни ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ сСкој си Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ своСто.

Гасоводот Π·Π° додавањС Π½ΠΎΠ²Π° Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ изглСдашС Π²Π°ΠΊΠ°:

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

И вСднаш послС Ρ‚ΠΎΠ°, ΠΌΠΈ стана ΠΌΠ½ΠΎΠ³Ρƒ полСсно Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ Π½ΠΎΠ²Π° функционалност, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·Π²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ ΠΈ ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ Rss. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ овој процСс ја Π±Π°Ρ€Π° ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° содрТина, Π° ΠΏΠΎΡ‚ΠΎΠ° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π·Π° ΠΈΠ·Π²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° RSS врски, ΠΊΠ°ΠΊΠΎ WebsiteIndexHistoryPersistor, сС ΠΏΡ€Π΅Ρ‚ΠΏΠ»Π°Ρ‚ΠΈ Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π° β€žΠ‘ΠΎΠ΄Ρ€ΠΆΠΈΠ½Π°/HtmlContentβ€œ, ја ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° ΠΈ ΠΏΠΎΠ½Π°Ρ‚Π°ΠΌΡƒ ја прСнСсува саканата ΠΏΠΎΡ€Π°ΠΊΠ° ΠΏΠΎ Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° линија.

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP backend Π²ΠΎ магистралата Π·Π° стримови Redis ΠΈ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° нСзависна ΠΎΠ΄ Ρ€Π°ΠΌΠΊΠ°

На ΠΊΡ€Π°Ρ˜ΠΎΡ‚, Π·Π°Π²Ρ€ΡˆΠΈΠ²ΠΌΠ΅ со Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π΄Π΅ΠΌΠΎΠ½ΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ сСкој ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π° врски само со ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ рСсурси. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅ΠΌΠΎΠ½ Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π³ΠΈ содрТи ситС ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΈ ΠΊΠΎΠΈ Π±Π°Ρ€Π°Π°Ρ‚ одСњС Π½Π° Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π·Π° содрТина ΠΈ Π΄Π΅ΠΌΠΎΠ½ΠΎΡ‚ ΠΎΠΏΡΡ‚ΠΎΡ˜ΡƒΠ²Π°Π°Ρ‚ ΠΈΠΌΠ° врска со Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π‘Π΅Π³Π°, намСсто Π΄Π° сС ΠΈΠ·Π±ΠΈΡ€Π° ΠΎΠ΄ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ ΠΏΠΎ Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ страна Π½Π° пСрсистСр Сдноставно сС прСнСсуваат ΠΏΡ€Π΅ΠΊΡƒ магистралата Π΄ΠΎ ситС заинтСрСсирани Ρ€Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈ.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€