
ΠΡΠ΅Π΄Π³ΠΎΠ²ΠΎΡ
ΠΠΎΡΡ ΡΠ°ΠΉΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΌ ΠΊΠ°ΡΠΎ Ρ
ΠΎΠ±ΠΈ, Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»Π½ΠΈ ΡΠ°ΠΉΡΠΎΠ²Π΅. Π’Π°Π·ΠΈ ΡΠ΅ΠΌΠ° ΠΌΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° Π² ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π½Π° ΠΌΠΎΡΡΠ° ΠΊΠ°ΡΠΈΠ΅ΡΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π±ΡΡ
Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ ΠΎΡ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΠΈΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΈΡΠ°Ρ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ, ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠ°Π²ΠΈΠΊΡΡ Π΄Π° Π³ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°ΠΌ ΠΎΡΡΠ°Π²Π° ΠΈ Π΄ΠΎ Π΄Π½Π΅Ρ: ΠΏΠΎΡΡΠΈ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΡΡΠ³ΠΎΠ²ΡΠΊΠΈ ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌ Π΄Π° Π½Π°Π΄Π½ΠΈΡΠ°ΠΌ Π² ΡΡΡΠ΅ΡΠ°, Π² ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ ΠΊΡΠΌ Π°Π²ΡΠΎΡΠΈΡΠ΅.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ΄Π΅ΡΡΠ°
ΠΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π±Π΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ html-ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° ΠΌΠΎΡ Π»ΠΈΡΠ΅Π½ ΡΠ°ΠΉΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΡΠ±ΠΈΡΠ°Ρ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π² ΡΠΏΠΈΡΡΠΊ ul. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°Π±ΡΠ°Ρ ΠΎΠΊΠΎΠ»ΠΎ 20 ΡΡΡΠ°Π½ΠΈΡΠΈ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΠΌΠΈΡΠ»Ρ, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈ ΡΠ΅ΡΠΈΡ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ° ΠΏΡΠΎΡΠ΅ΡΠ°. ΠΠ° stackoverflow Π·Π°Π±Π΅Π»ΡΠ·Π²Π°Ρ , ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ° ΠΏΠΎΡΠΎΡΠ²Π°Ρ ΡΠ°ΠΉΡΠΎΠ²Π΅ Π² ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ΅ ΡΠΈ, Π·Π°ΡΠΎΠ²Π° Π½Π°ΠΏΠΈΡΠ°Ρ ΠΏΠ°ΡΡΠ΅Ρ Π½Π° php, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΌΠΈΠ½Π°Π²Π°ΡΠ΅ ΠΏΡΠ΅Π· ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ΅, Π·Π°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ ΠΏΡΡΠ²ΠΈΡ (Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° SO ΠΈ Π΄ΠΎ Π΄Π½Π΅ΡΠ΅Π½ Π΄Π΅Π½ ΡΠ° ΠΎΡ ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄: `\/users\/1`), ΠΈΠ·Π²Π»ΠΈΡΠ°ΡΠ΅ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠ°Π³ ΠΈ Π³ΠΈ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π² SQLite.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΠ΅ΡΠ΅ΡΠ΅ ΡΠΎΠ²Π° Π²ΡΠΎΡΠ° Π²Π΅ΡΡΠΈΡ: ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ Π΄Π΅ΡΠ΅ΡΠΊΠΈ Ρ ΠΈΠ»ΡΠ΄ΠΈ url Π°Π΄ΡΠ΅ΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° SQLite, ΠΊΠΎΡΡΠΎ Π·Π°ΠΌΠ΅Π½ΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ ΡΠΏΠΈΡΡΠΊ Π² html. ΠΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΡΠΏΠΈΡΡΠΊ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΏΡΠΎΡΡ ΡΡΡΡΠ°Ρ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ url Π°Π΄ΡΠ΅ΡΠΈ, ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎ ΡΡΡ .
ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π·Π°ΡΡΠ·Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠ΅ Π²ΡΡΠ½Π°Ρ ΠΊΡΠΌ Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΎΠΏΠΈΡΡΡ ΠΌΠΈ Π² ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π²Π΅ΡΠ΅ Π½Π°Π΄ΠΌΠΈΠ½Π°Π²Π°ΡΠ΅ ΡΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ ΡΡΠ²ΡΡΠ²Π°Ρ , ΡΠ΅ ΠΌΠΎΠ³Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ Π½Π΅ΡΠΎ ΠΏΠΎ-ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΈΠΌΠ°ΡΠ΅ Π³ΠΎΠ»ΡΠΌΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° ΡΡΠ²ΠΎΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ Π½ΠΎΠ²ΠΈ Π·Π° ΠΌΠ΅Π½ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.
Π‘ΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π° Π²Π΅ΡΡΠΈΡ
ΡΠ°Π·Π²ΠΈΡΠ° Π² Docker, Π±Π°Π·Π°ΡΠ° Π΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ΅Π½Π° Π½Π° MongoDB, ΠΈ ΠΎΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠΊΠΎΡΠΎ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Redis, ΠΊΠΎΠΉΡΠΎ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π±Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅. ΠΠ° ΠΎΡΠ½ΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΌΠΈΠΊΡΠΎΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΡΠΈΡΠ΅ Π½Π° PHP.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°
ΠΠΎΠ²ΠΈ ΡΠ°ΠΉΡΠΎΠ²Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ Ρ ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡΡΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- Π‘Π²Π°Π»ΠΈ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ URL
- ΠΠΎΡΡΠ°Π²Ρ ΡΠ»Π°Π³ Π·Π° ΡΠΎΠ²Π° Π΄Π°Π»ΠΈ HTTPS Π΅ Π±ΠΈΠ» Π΄ΠΎΡΡΡΠΏΠ΅Π½
- ΠΠ°ΠΏΠ°Π·Π²Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π±ΡΠ°ΠΉΡΠ°
- ΠΠ·Ρ ΠΎΠ΄Π½ΠΈΡΡ HTML ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΡΡΠ° ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π² ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° "ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ΡΠΎ"
- ΠΠ°ΡΡΠΈΡΠ° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ, ΠΈΠ·Π²Π»ΠΈΡΠ° Title ΠΈ Description
- ΠΠ°Π½Π½ΠΈΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π² ΠΎΡΠ΄Π΅Π»Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ
Π’ΠΎΠ²Π° Π±Π΅ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌ ΡΠ°ΠΉΡΠΎΠ²Π΅ ΠΈ Π΄Π° Π³ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌ Π² ΡΠΏΠΈΡΡΠΊ:

ΠΠΎ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΠΊΠ»Π°ΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΎ, Π·Π° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ Π°ΠΊΡΡΠ°Π»Π½ΠΎΡΡΡΠ°, Π½Π΅ ΡΠ΅ Π²ΠΏΠΈΡΠ²Π°ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π² ΡΠ°Π·ΠΈ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ°. ΠΠ°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ΅Π±-ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ DDoS Π°ΡΠ°ΠΊΠΈ.
ΠΡΡΡΠ½ΠΎΡΡ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π²ΡΠΈΡΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ, Π° Π² ΡΠ΅Π±-ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ URL, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠ½ΡΡΡΡΠΎΠ·Π½ΠΈΡΡ Π΄Π΅ΠΌΠΎΠ½ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ Π·Π° URL ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ°. ΠΠΎ Π΄ΠΎΡΠΈ ΠΈ ΡΡΠΊ Π½Π°ΡΡΠ°ΠΏΡΠΈΠ²ΠΎ ΠΈΠ·Π½ΠΈΠΊΠ²Π° Π΄ΡΠΌΠ°ΡΠ° βΠΎΠΏΠ°ΡΠΊΠ°β. Π Π°ΠΊΠΎ ΡΠ΅ Π²Π½Π΅Π΄ΡΠΈ ΠΎΠΏΠ°ΡΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΡ Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΠΎΠ½Π΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅
ΠΠ° Π²Π½Π΅Π΄ΡΠΈΠΌ ΠΎΠΏΠ°ΡΠΊΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠ±ΠΈΡΠΈΠΉΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ. Π ΠΎΡΠ΄Π°Π²Π½Π° ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ Redis Streams.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Redis streams Π² PHP
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΡΡ ΠΌΠΈ Π½Π΅ Π΅ ΠΎΡ ΡΡΠΈΡΠ΅ Π³ΠΈΠ³Π°Π½ΡΠ° Symfony, Laravel, Yii, ΠΈΡΠΊΠ°Ρ Π΄Π° Π½Π°ΠΌΠ΅ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°. ΠΠΎ, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π° (ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎΡΠΎ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅) β Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΠΈΡΠΊΠΎ, ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΠΎΠΏΠ°ΡΠΊΠΈ, ΠΈΠ»ΠΈ Π΅ ΠΏΡΠΎΠ΅ΠΊΡ Ρ 3 ΠΊΠΎΠΌΠΈΡΠ° ΠΎΡΠΏΡΠ΅Π΄ΠΈ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΈΠ»ΠΈ Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
Π§ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π° Symfony, ΠΊΠ°ΡΠΎ Π·Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, Π° ΠΈ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ Π²Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ. Π ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ°ΡΡ ΠΎΡ Laravel ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Ρ Π½ΠΈΡΡ ORM, Π±Π΅Π· Π΄Π° ΠΏΡΠΈΡΡΡΡΠ²Π° ΡΠ°ΠΌΠΈΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ.
symfony/messenger
ΠΡΡΠ²ΠΈΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ Π²Π΅Π΄Π½Π°Π³Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΠΈ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ ΡΡΠΌΠ½Π΅Π½ΠΈΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ . ΠΠΎ Π΄Π° Π½Π°ΠΌΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠ·Π²ΡΠ½ Symfony ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΠ°ΠΊ Π΄Π° ΡΠ³Π»ΠΎΠ±Ρ ΠΎΡ ΠΊΡΠΏ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈ, Π½ΠΈΡΠΎ Π½Π΅Π·Π½Π°ΡΠ΅ΡΠΈ ΠΈΠΌΠ΅Π½Π° ΡΠΈΠ½Π° Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈ ΡΠΎ Π½Π° Redis?

ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΡΠ°ΠΉΡ Π±Π΅ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π°, Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠ°ΠΌΠΎ Π·Π° Symfony, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅Ρ
Π½ΠΈΡ Π»ΡΠ±ΠΈΠΌ YML ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π½Π΅ΡΠΈΠΌΡΠΎΠ½ΠΈΡΡΠΈ. ΠΡΠΌΠ°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Ρ ΠΌΠ΅Π½ ΠΊΡΠΌ ΡΠ°ΠΌΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠ°Π·Π½ΠΈΡΠΈ. ΠΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ Ρ ΡΠΎΠ²Π° ΠΈ Π½Π΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎ Π΄ΡΠ»Π³ΠΎ.
ΠΠΏΠΈΡΡΡ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ° Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΏΠΎ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Symfony ΡΡΡΠΎ Π½Π΅ Π΅ Π½Π°ΠΉ-ΡΡΠΈΠ²ΠΈΠ°Π»Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π·Π° ΠΊΡΠ°ΡΠΊΠΈ ΡΡΠΎΠΊΠΎΠ²Π΅:

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΏΠΎΠΌΠ°ΠΉΠ²Π°Ρ
Π² ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΎ ΠΈ ΠΎΠΏΠΈΡΠ°Ρ
Π½Π΅ΡΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΡΡΠ΅, ΡΡΠΈΠ³Π½Π°Ρ
Π΄ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π°, ΡΠ΅ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ Ρ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΠΊΠΎΡΡΠΈΠ»ΠΊΠΈ ΠΈ ΡΠ΅ΡΠΈΡ
Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ.
illuminate/queue
ΠΠΊΠ°Π·Π° ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ ΠΏΠ»ΡΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π°Π½Π° Ρ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Laravel ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, Π·Π°ΡΠΎΠ²Π° Π½Π΅ ΠΎΡΠ΄Π΅Π»ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π½Π΅Ρ: ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Ρ, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ , Π²ΠΈΠ΄ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ ΠΈ Ρ ΠΈΠ·ΡΡΠΈΡ .
yiisoft/yii2-queue
Π’ΡΠΊ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΎΡ ΠΈΠΌΠ΅ΡΠΎ, ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΡΡΠΎΠ³Π° ΠΏΡΠΈΠ²ΡΡΠ·Π°Π½ΠΎΡΡ ΠΊΡΠΌ Yii2. Π’Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΌΠΈ ΡΠ΅ Π΅ Π½Π°Π»Π°Π³Π°Π»ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΈ Π±Π΅ΡΠ΅ Π΄ΠΎΠ±ΡΠ°, Π½ΠΎ Π½Π΅ ΠΌΠΈΡΠ»Π΅Ρ , ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠ° ΠΎΡ Yii2.
ΠΡΡΠ°Π½Π°Π»ΠΈΡΠ΅
ΠΡΠΈΡΠΊΠΎ Π΄ΡΡΠ³ΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡ Π² GitHub β Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΎΡΡΠ°ΡΠ΅Π»ΠΈ ΠΈ ΠΈΠ·ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π±Π΅Π· Π·Π²Π΅Π·Π΄ΠΈ, ΡΠΎΡΠΊΠΎΠ²Π΅ ΠΈ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΊΠΎΠΌΠΈΡΠΈ.
ΠΡΡΡΠ°Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊΡΠΌ symfony/messenger, ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ
Π’ΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ Ρ ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ, ΠΎΡΠ΄Π΅Π»ΡΠΉΠΊΠΈ ΠΎΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΏΡΡ . ΠΠΊΠ°Π·Π° ΡΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎ. ΠΠ° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠ½Π°, Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ°Π»ΠΊΠ° ΡΠ°Π±ΡΠΈΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ΠΈΡ , ΡΠ΅ ΡΠ΅ ΠΈΠΌΠ°ΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΈΠ½ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ.

Π‘Π°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠΏΠΊΠΈ:
- Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΡΡΠΎ callable
- ΠΠ°Π²ΠΈΠ²Π°ΠΌΠ΅ Π³ΠΈ Π² HandlerDescriptor (ΠΊΠ»Π°Ρ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°)
- Π’Π΅Π·ΠΈ βΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈβ Π·Π°Π²ΠΈΠ²Π°ΠΌΠ΅ Π² ΠΈΠ½ΡΡΠ°Π½Ρ HandlersLocator
- ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ HandlersLocator Π² ΠΈΠ½ΡΡΠ°Π½Ρ MessageBus
- ΠΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ Π² SendersLocator Π½Π°Π±ΠΎΡ ΠΎΡ `SenderInterface`, Π² ΠΌΠΎΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ½ΡΡΠ°Π½ΡΠΈ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ `RedisTransport`, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Ρ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ
- ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ SendersLocator Π² ΠΈΠ½ΡΡΠ°Π½Ρ MessageBus
MessageBus ΠΈΠΌΠ° ΠΌΠ΅ΡΠΎΠ΄ `->dispatch()`, ΠΊΠΎΠΉΡΠΎ ΡΡΡΡΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π² HandlersLocator ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠΌ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ `SenderInterface` Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ ΠΏΡΠ΅Π· ΡΠΈΠ½Π°ΡΠ° (Redis streams).
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° (Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ php-di) ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π° ΡΠ°ΠΊΠ°:
CONTAINER_REDIS_TRANSPORT_SECRET => ΡΡΠ½ΠΊΡΠΈΡ (ContainerInterface $c) {
return new RedisTransport(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
$c->get(CONTAINER_SERIALIZER))
;
},
CONTAINER_REDIS_TRANSPORT_LOG => ΡΡΠ½ΠΊΡΠΈΡ (ContainerInterface $c) {
return new RedisTransport(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
$c->get(CONTAINER_SERIALIZER))
;
},
CONTAINER_REDIS_STREAM_RECEIVER_SECRET => ΡΡΠ½ΠΊΡΠΈΡ (ContainerInterface $c) {
return new RedisReceiver(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
$c->get(CONTAINER_SERIALIZER)
);
},
CONTAINER_REDIS_STREAM_RECEIVER_LOG => ΡΡΠ½ΠΊΡΠΈΡ (ContainerInterface $c) {
return new RedisReceiver(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
$c->get(CONTAINER_SERIALIZER)
);
},
CONTAINER_REDIS_STREAM_BUS => ΡΡΠ½ΠΊΡΠΈΡ (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 => ΡΡΠ½ΠΊΡΠΈΡ (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 => ΡΡΠ½ΠΊΡΠΈΡ (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 Π·Π° Π΄Π²Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΌΠ΅ Π·Π°Π΄Π°Π»ΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ βΡΡΠ°Π½ΡΠΏΠΎΡΡβ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ Π½Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΡΡΡΠΈΠΉΠΌΠΎΠ²Π΅.
Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ ΠΎΡΠ΄Π΅Π»Π΅Π½ Π΄Π΅ΠΌΠΎ ΠΏΡΠΎΠ΅ΠΊΡ, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΡΠΈ Π΄Π΅ΠΌΠΎΠ½Π°, ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°ΡΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ ΡΡΠ΅Π· ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΠ½Π°: .
ΠΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΡΡΠΎΠ΅Π½ ΠΊΠΎΠ½ΡΡΡΠΌΠ΅Ρ:
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ AppMessagesDaemonLogMessage;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerHandlerHandlerDescriptor;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerHandlerHandlersLocator;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerMessageBus;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SymfonyComponentMessengerTransportSenderSendersLocator;
ΠΈΠ·ΠΈΡΠΊΠ²Π°ΠΉΡΠ΅ Π²Π΅Π΄Π½ΡΠΆ __DIR__ . '/.. /vendor/autoload.php';
/** @var PsrContainerContainerInterface $container * /
$container = ΠΈΠ·ΠΈΡΠΊΠ²Π°ΠΉΡΠ΅ Π²Π΅Π΄Π½ΡΠΆ('config/container.php');
$handlers = [
DaemonLogMessage::class => [
Π½ΠΎΠ² HandlerDescriptor(
ΡΡΠ½ΠΊΡΠΈΡ (DaemonLogMessage $m) {
error_log('DaemonLogHandler: ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΎ: / ' . $m->getMessage());
},
['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
)
],
];
$middleware = [];
$middleware[] = Π½ΠΎΠ² HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = Π½ΠΎΠ² SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = Π½ΠΎΠ² SendMessageMiddleware($sendersLocator);
$bus = Π½ΠΎΠ² MessageBus($middleware);
$receivers = [
CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = Π½ΠΎΠ² SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΠΈΠ½Π°ΡΠ° Π² ΡΠ²ΠΎΡ Π±Π΅ΠΊΠ΅Π½Π΄, ΠΎΡΠ΄Π΅Π»ΠΈΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΡΡΠΏΠΊΠΈ ΠΎΡ ΡΡΠ°ΡΠ°ΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΎΡΠ΄Π΅Π»Π½ΠΈ Ρ Π΅Π½Π΄Π»Π΅ΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ.
ΠΡΠΎΡΠ΅ΡΡΡ ΠΏΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½ΠΎΠ² ΡΠ°ΠΉΡ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:

Π Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΈ ΡΡΠ°Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌ Π½ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π° Π½Π° RSS. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΡΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅, Ρ
Π΅Π½Π΄Π»Π΅ΡΡΡ, ΠΈΠ·Π²Π»ΠΈΡΠ°Ρ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ ΠΊΡΠΌ RSS, ΠΊΠ°ΠΊΡΠΎ ΠΈ WebsiteIndexHistoryPersistor, ΡΠ΅ Π°Π±ΠΎΠ½ΠΈΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ "Content/HtmlContent", ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π³ΠΎ ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° Π½ΡΠΆΠ½ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠ²ΠΎΡ ΠΏΡΡ.

Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡ
Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄Π΅ΠΌΠΎΠ½Π°, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΌΠΎ ΠΊΡΠΌ Π½ΡΠΆΠ½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΌΠΎΠ½ΡΡ crawlers ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅, Π° Π΄Π΅ΠΌΠΎΠ½ΡΡ persister ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΡΠ·ΠΊΠ° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
Π‘Π΅Π³Π° Π²ΠΌΠ΅ΡΡΠΎ SELECT ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π½ΡΠΆΠ½ΠΈΡΠ΅ ΠΈΠ΄ ΡΠ»Π΅Π΄ Π²ΡΡΠ°Π²ΠΊΠ°ΡΠ° ΠΎΡ persister-Π° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΡΠ΅Π· ΡΠΈΠ½Π°ΡΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
