ΠΏΡΠ΅Π΄Π³ΠΎΠ²ΠΎΡΠΎΡ
ΠΠΎΡΠ°ΡΠ° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°, ΠΊΠΎΡΠ° ΡΠ° Π²ΠΎΠ΄Π°ΠΌ ΠΊΠ°ΠΊΠΎ Ρ
ΠΎΠ±ΠΈ, Π΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΏΠΎΡΠ΅ΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈ Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ. ΠΠ²Π°Π° ΡΠ΅ΠΌΠ° ΠΏΠΎΡΠ½Π° Π΄Π° ΠΌΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ° Π½Π° ΡΠ°ΠΌΠΈΠΎΡ ΠΏΠΎΡΠ΅ΡΠΎΠΊ Π½Π° ΠΌΠΎΠ΅ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΎ ΠΏΠ°ΡΡΠ²Π°ΡΠ΅; Π²ΠΎ ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π±Π΅Π² ΡΠ°ΡΡΠΈΠ½ΠΈΡΠ°Π½ ΠΎΠ΄ Π½Π°ΠΎΡΠ°ΡΠ΅ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠΈ ΠΊΠΎΠΈ ΠΏΠΈΡΡΠ²Π°Π°Ρ Π·Π° ΡΠ΅Π±Π΅, Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ Ρ
ΠΎΠ±ΠΈ ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠ°Π²ΠΈΠΊΠ°ΡΠ° Π΄Π° Π³ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°ΠΌ Π·Π° ΡΠ΅Π±Π΅ ΠΎΡΡΠ°Π½ΡΠ²Π° Π΄ΠΎ Π΄Π΅Π½-Π΄Π΅Π½Π΅Ρ: Π½Π° ΡΠ΅ΡΠΈΡΠΈ ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠ΅ΡΡΠΈΡΠ°Π»Π½Π° ΠΈ Π½Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΊΠΎΠΌΠ΅ΡΡΠΈΡΠ°Π»Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°ΠΌ Π΄Π° Π³Π»Π΅Π΄Π°ΠΌ Π²ΠΎ ΠΏΠΎΠ΄Π½ΠΎΠΆΡΠ΅ΡΠΎ Π²ΠΎ ΠΏΠΎΡΡΠ°Π³Π° ΠΏΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ Π΄ΠΎ Π°Π²ΡΠΎΡΠΈΡΠ΅.
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΈΠ΄Π΅ΡΠ°ΡΠ°
ΠΡΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π±Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ html ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° ΠΌΠΎΡΠ°ΡΠ° Π»ΠΈΡΠ½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΡΠ°Π²Π°ΠΌ Π²ΡΡΠΊΠΈ ΡΠΎ ΠΏΠΎΡΠΏΠΈΡΠΈ Π²ΠΎ ΡΠ» Π»ΠΈΡΡΠ°. ΠΡΠΊΠ°ΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Π² 20 ΡΡΡΠ°Π½ΠΈΡΠΈ Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄, ΠΏΠΎΡΠ½Π°Π² Π΄Π° ΠΌΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ ΠΈ ΡΠ΅ΡΠΈΠ² Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΠΎΡ. ΠΠ° stackoverflow, Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π² Π΄Π΅ΠΊΠ° ΠΌΠ½ΠΎΠ³Ρ Π»ΡΡΠ΅ ΠΏΠΎΡΠΎΡΡΠ²Π°Π°Ρ ΡΠ°ΡΡΠΎΠ²ΠΈ Π²ΠΎ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ»ΠΈ, ΠΏΠ° Π½Π°ΠΏΠΈΡΠ°Π² ΠΏΠ°ΡΡΠ΅Ρ Π²ΠΎ php, ΠΊΠΎΡ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΏΠΎΠΌΠΈΠ½Π° Π½ΠΈΠ· ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ΅, ΠΏΠΎΡΠ½ΡΠ²Π°ΡΡΠΈ ΠΎΠ΄ ΠΏΡΠ²ΠΈΠΎΡ (Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° SO Π΄ΠΎ Π΄Π΅Π½Π΅Ρ ΡΠ΅ Π²Π°ΠΊΠ°: `/users/1` ), ΠΈΠ·Π²Π°Π΄ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ ΠΎΠ΄ ΡΠ°ΠΊΠ°Π½Π°ΡΠ° ΠΎΠ·Π½Π°ΠΊΠ° ΠΈ ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ Π²ΠΎ SQLite.
ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ Π²ΡΠΎΡΠ°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ°: Π·Π±ΠΈΡΠΊΠ° ΠΎΠ΄ Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΠΈΠ»ΡΠ°Π΄ΠΈ URL-Π°Π΄ΡΠ΅ΡΠΈ Π²ΠΎ ΡΠ°Π±Π΅Π»Π° SQLite, ΠΊΠΎΡΠ° ΡΠ° Π·Π°ΠΌΠ΅Π½ΠΈ ΡΡΠ°ΡΠΈΡΠ½Π°ΡΠ° Π»ΠΈΡΡΠ° Π²ΠΎ html. ΠΠ°ΠΏΡΠ°Π²ΠΈΠ² Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ°. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ URL-Π°Π΄ΡΠ΅ΡΠΈ, ΡΠΎΠ³Π°Ρ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ Π±Π°Π·ΠΈΡΠ°ΡΠ΅ Π½Π° Π½ΠΈΠ².
ΠΠΎ ΠΎΠ²Π°Π° ΡΠ°Π·Π° Π³ΠΎ Π½Π°ΠΏΡΡΡΠΈΠ² ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΠΈ ΡΠ΅ Π²ΡΠ°ΡΠΈΠ² Π½Π° Π½Π΅Π³ΠΎ ΠΏΠΎ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠΎ ΠΎΠ²Π°Π° ΡΠ°Π·Π°, ΠΌΠΎΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π±Π΅ΡΠ΅ Π²Π΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ ΡΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ ΡΡΠ²ΡΡΠ²ΡΠ²Π°Π² Π΄Π΅ΠΊΠ° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²Π°ΠΌ Π½Π΅ΡΡΠΎ ΠΏΠΎΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ. ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΈΠΌΠ°ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΆΠ΅Π»Π±Π° Π΄Π° ΡΠ΅ ΡΠΎΠ²Π»Π°Π΄Π°Π°Ρ ΡΠ΅Π»Π°ΡΠΈΠ²Π½ΠΎ Π½ΠΎΠ²ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.
ΠΠΎΠ΄Π΅ΡΠ½Π° Π²Π΅ΡΠ·ΠΈΡΠ°
ΠΏΡΠΎΠ±Π»Π΅ΠΌ
ΠΠΎΠ²ΠΈΡΠ΅ Π»ΠΎΠΊΠ°ΡΠΈΠΈ ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΊΠΎΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΎ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ:
- ΠΡΠ΅Π·Π΅ΠΌΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π° ΠΏΠΎ URL
- ΠΠΎΡΡΠ°Π²ΡΠ²Π° Π·Π½Π°ΠΌΠ΅Π½ΡΠ΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π΄Π°Π»ΠΈ HTTPS Π±ΠΈΠ» Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½
- ΠΠ° Π·Π°ΡΡΠ²ΡΠ²Π° ΡΡΡΡΠΈΠ½Π°ΡΠ° Π½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°
- ΠΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ HTML ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΡΠ°ΡΠ° ΡΠ΅ Π·Π°ΡΡΠ²Π°Π½ΠΈ Π²ΠΎ ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° βΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°ΡΠ΅β.
- ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°, Π΅ΠΊΡΡΡΠ°ΠΊΡΠΈ ΠΠ°ΡΠ»ΠΎΠ² ΠΈ ΠΎΠΏΠΈΡ
- ΠΠ°ΡΡΠ²ΡΠ²Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡΠ°
ΠΠ²Π° Π±Π΅ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ ΡΠ°ΡΡΠΎΠ²ΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Ρ Π²ΠΎ ΡΠΏΠΈΡΠΎΠΊ:
ΠΠΎ, ΠΈΠ΄Π΅ΡΠ°ΡΠ° Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°ΡΠ΅, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠ°Π½Π³ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΓ¨, ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΡΓ¨ Π²ΠΎ ΡΠ΅ΠΊ, Π½Π΅ ΡΠ΅ Π²ΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ Π΄ΠΎΠ±ΡΠΎ Π²ΠΎ ΠΎΠ²Π°Π° ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ°. ΠΡΡΠΈ ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π²Π΅Π±-ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΈ Π±Π°ΡΠ° Π΄ΡΠΏΠ»ΠΈΡΠ°ΡΠ΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ ΠΏΠΎΡΠ΅Π½ΡΠΈΡΠ°Π»Π΅Π½ DDoS.
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΓ¨ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΎ, Π° Π²ΠΎ Π²Π΅Π±-ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° Π³ΠΎ Π·Π°ΡΡΠ²Π°ΡΠ΅ URL-ΡΠΎ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΡΡΠ΄ΠΎΠ²ΠΈΡΠ½ΠΈΠΎΡ Π΄Π΅ΠΌΠΎΠ½ Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π·Π° URL-Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΠΎΠ΄ ΡΠΏΠΈΡΠΎΠΊΠΎΡ. ΠΠΎ, ΡΠ΅ΠΏΠ°ΠΊ, Π΄ΡΡΠΈ ΠΈ ΠΎΠ²Π΄Π΅ Π·Π±ΠΎΡΠΎΡ βΡΠ΅Π΄ΠΈΡΠ°β ΡΠ΅ ΡΡΠ³Π΅ΡΠΈΡΠ°. Π Π°ΠΊΠΎ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠ΅Π΄ΠΈΡΠ°, ΡΠΎΠ³Π°Ρ ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΅Π»Π°Ρ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠ°Ρ Π±Π°ΡΠ΅ΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΎ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅
Π‘ΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅Π΄ΠΈΡΠΈ ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΈΡΡΠ΅ΠΌ ΡΠΏΡΠ°Π²ΡΠ²Π°Π½ ΠΎΠ΄ Π½Π°ΡΡΠ°Π½ΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ. Π Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ°ΠΊΠ°ΠΌ Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ±Π°ΠΌ Redis Streams.
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΡΡΠΈΠΌΠΎΠ²ΠΈ Π½Π° Redis Π²ΠΎ PHP
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠΎΡΠ°ΡΠ° ΡΠ°ΠΌΠΊΠ° Π½Π΅ Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΡΠΈΡΠ΅ Π³ΠΈΠ³Π°Π½ΡΠΈ Symfony, Laravel, Yii, Π±ΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π½Π°ΡΠ΄Π°ΠΌ Π½Π΅Π·Π°Π²ΠΈΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°. ΠΠΎ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΈΡΠΏΠΎΡΡΠ°Π²ΠΈ (Π½Π° ΠΏΡΠ²ΠΎΡΠΎ ΠΈΡΠΏΠΈΡΡΠ²Π°ΡΠ΅), Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»Π½ΠΈ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. Π‘Γ¨ ΡΡΠΎ Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΎ ΡΠΎ ΡΠ΅Π΄ΠΈΡΠΈΡΠ΅ Π΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΠ΄ 3 commit ΠΏΡΠ΅Π΄ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΈΠ»ΠΈ Π΅ Π²ΡΠ·Π°Π½ΠΎ Π·Π° ΡΠ°ΠΌΠΊΠ°ΡΠ°.
Π‘Π»ΡΡΠ½Π°Π² ΠΌΠ½ΠΎΠ³Ρ Π·Π° Symfony ΠΊΠ°ΠΊΠΎ ΡΠ½Π°Π±Π΄ΡΠ²Π°Ρ Π½Π° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΈ Π²Π΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ Π½ΠΈΠ². Π ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΈ Π½Π΅ΠΊΠΎΠΈ ΡΠ°Π±ΠΎΡΠΈ ΠΎΠ΄ Laravel, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΈΠ²Π½Π°ΡΠ° ORM, Π±Π΅Π· ΠΏΡΠΈΡΡΡΡΠ²ΠΎ Π½Π° ΡΠ°ΠΌΠ°ΡΠ° ΡΠ°ΠΌΠΊΠ°.
ΡΠΈΠΌΡΠΎΠ½ΠΈΡΠ°/Π³Π»Π°ΡΠ½ΠΈΠΊ
ΠΡΠ²ΠΈΠΎΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ Π²Π΅Π΄Π½Π°Ρ ΠΌΠΈ ΡΠ΅ ΡΠΈΠ½Π΅ΡΠ΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½ ΠΈ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΠΌΠ½Π΅Π²Π°ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π². ΠΠΎ, ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π΅ ΠΏΠΎΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ³Π»Π°Π°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ Symfony. ΠΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠΎΡΡΠ°Π²ΠΈ Π°Π²ΡΠΎΠ±ΡΡ Π·Π° ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ ΠΎΠ΄ ΠΊΡΠΏ ΡΠ°ΡΠΎΠ²ΠΈ ΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΠ·Π°Π»Π½ΠΈ, Π±Π΅ΡΠΌΠΈΡΠ»Π΅Π½ΠΈ ΠΈΠΌΠΈΡΠ°, ΠΏΠ° Π΄ΡΡΠΈ ΠΈ Π½Π° Π Π΅Π΄ΠΈΡ?
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΎΡΠΈΡΠΈΡΠ°Π»Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π±Π΅ΡΠ΅ Π΄ΠΎΡΡΠ° Π΄Π΅ΡΠ°Π»Π½Π°, Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ° Π±Π΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠ°ΠΌΠΎ Π·Π° Symfony ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΠΎΠΌΠΈΠ»Π΅Π½ΠΈ YML ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠ°Π³ΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π½Π΅ΡΠΈΠΌΡΠΎΠ½ΠΈΡΡΠΎΡ. ΠΠ΅ΠΌΠ°Π² Π½ΠΈΠΊΠ°ΠΊΠΎΠ² ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Π·Π° ΡΠ°ΠΌΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ°, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠ°Π·Π½ΠΈΡΠΈ. ΠΠΎ, ΠΌΠΎΡΠ°Π² Π΄Π° Π³ΠΎ ΠΏΡΠ°Π²Π°ΠΌ ΠΎΠ²Π° Π½Π΅ΠΎΡΠ΅ΠΊΡΠ²Π°Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ±ΠΈΠ΄ΠΎΡ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΈΡΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΈΠ·Π²ΠΎΡΠΈ Π½Π° Symfony, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, Π½Π΅ Π΅ Π½Π°ΡΡΡΠΈΠ²ΠΈΡΠ°Π»Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π·Π° ΡΠ΅ΡΠ΅Π½ ΡΠΎΠΊ:
ΠΡΠΊΠ°ΠΊΠΎ Π½Π°Π²Π»Π΅Π³ΡΠ²Π°Π² Π²ΠΎ ΡΠ΅ΡΠΎ ΠΎΠ²Π° ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π½Π°ΠΏΡΠ°Π²Π°ΠΌ Π½Π΅ΡΡΠΎ ΡΠΎ ΡΠ°ΡΠ΅ΡΠ΅, Π΄ΠΎΡΠ΄ΠΎΠ² Π΄ΠΎ Π·Π°ΠΊΠ»ΡΡΠΎΠΊ Π΄Π΅ΠΊΠ° ΠΏΡΠ°Π²Π°ΠΌ Π½Π΅ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠ°ΡΠ΅ΡΠΈΡΠΈ ΠΈ ΡΠ΅ΡΠΈΠ² Π΄Π° ΠΏΡΠΎΠ±Π°ΠΌ Π½Π΅ΡΡΠΎ Π΄ΡΡΠ³ΠΎ.
ΠΎΡΠ²Π΅ΡΠ»Π΅Π½Π°/ΡΠ΅Π΄ΠΈΡΠ°
Π‘Π΅ ΠΈΡΠΏΠΎΡΡΠ°Π²ΠΈ Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ ΡΠ²ΡΡΡΠΎ ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΡΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΠ°ΡΠ°Π²Π΅Π» ΠΈ Π΅Π΄Π΅Π½ ΠΊΡΠΏ Π΄ΡΡΠ³ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ Π½Π΅ ΠΏΠΎΡΡΠΎΡΠΈΠ² ΠΌΠ½ΠΎΠ³Ρ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π΅Π°: ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π², ΡΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π², Π³ΠΈ Π²ΠΈΠ΄ΠΎΠ² Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅ ΠΈ ΡΠ° ΠΈΠ·Π±ΡΠΈΡΠ°Π².
yiisoft/yii2-ΡΠ΅Π΄ΠΈΡΠ°
ΠΠ°, ΡΡΠΊΠ° Π²Π΅Π΄Π½Π°Ρ ΡΠ΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΡΡΡΠΎΠ³Π° Π²ΡΡΠΊΠ° ΡΠΎ Yii2. ΠΠΎΡΠ°Π² Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ Π½Π΅ Π±Π΅ΡΠ΅ Π»ΠΎΡΠ°, Π½ΠΎ Π½Π΅ ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°Π² Π·Π° ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΠ΅Π»ΠΎΡΠ½ΠΎ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ Yii2.
ΠΡΡΠ°ΡΠΎΠΊΠΎΡ
Π‘Γ¨ Π΄ΡΡΠ³ΠΎ ΡΡΠΎ Π³ΠΎ Π½Π°ΡΠ΄ΠΎΠ² Π½Π° GitHub Π±Π΅Π° Π½Π΅ΡΠΈΠ³ΡΡΠ½ΠΈ, Π·Π°ΡΡΠ°ΡΠ΅Π½ΠΈ ΠΈ Π½Π°ΠΏΡΡΡΠ΅Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π±Π΅Π· ΡΠ²Π΅Π·Π΄ΠΈ, Π²ΠΈΠ»ΡΡΠΊΠΈ ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π° ΠΎΠ±Π²ΡΡΠΊΠΈ.
ΠΡΠ°ΡΠΈ ΡΠ΅ Π½Π° ΡΠΈΠΌΡΠΎΠ½ΠΈΡΠ°/ΠΌΠ΅ΡΠΈΠ½ΡΠ΅Ρ, ΡΠ΅Ρ Π½ΠΈΡΠΊΠΈ Π΄Π΅ΡΠ°Π»ΠΈ
ΠΠΎΡΠ°Π² Π΄Π° ΡΠ° ΡΡΠ°ΡΠ°ΠΌ ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ, ΠΎΡΠΊΠ°ΠΊΠΎ ΠΏΠΎΠΌΠΈΠ½Π°Π² ΡΡΡΠ΅ ΠΌΠ°Π»ΠΊΡ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΏΠ΅Π°Π². Π‘Π΅ ΠΈΡΠΏΠΎΡΡΠ°Π²ΠΈ Π΄Π΅ΠΊΠ° ΡΓ¨ Π΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ·Π½ΠΎ ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ. ΠΠ° Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°ΠΌ Π°Π²ΡΠΎΠ±ΡΡΠΎΡ, Π½Π°ΠΏΡΠ°Π²ΠΈΠ² ΠΌΠ°Π»Π° ΡΠ°Π±ΡΠΈΠΊΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ... Π’ΡΠ΅Π±Π°ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΡΠΌΠΈ ΠΈ ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°ΠΊΡΠ²Π°ΡΠΈ.
Π‘Π°ΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΠΎΡΠΈ:
- ΠΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°ΠΊΡΠ²Π°ΡΠΈ ΡΠΎ ΠΏΠΎΡΠ°ΠΊΠΈ ΠΊΠΎΠΈ ΡΡΠ΅Π±Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°Π°Ρ
- ΠΠΈ Π·Π°Π²ΠΈΡΠΊΡΠ²Π°ΠΌΠ΅ Π²ΠΎ 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 Π΄ΠΎΠ΄Π΅Π»ΠΈΠ²ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ βΡΡΠ°Π½ΡΠΏΠΎΡΡΠΈβ Π·Π° Π΄Π²Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΠ°ΠΊΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ ΡΠ΅ΠΊΠΎΡΠ° ΠΈΠΌΠ° ΡΠ²ΠΎΡΠ° Π²ΡΡΠΊΠ° ΡΠΎ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΠ²ΠΈ.
ΠΠ°ΠΏΡΠ°Π²ΠΈΠ² ΠΏΠΎΡΠ΅Π±Π΅Π½ Π΄Π΅ΠΌΠΎ-ΠΏΡΠΎΠ΅ΠΊΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΡΡΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ΄ ΡΡΠΈ Π΄Π΅ΠΌΠΎΠ½ΠΈ ΠΊΠΎΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°Π°Ρ Π΅Π΄Π½ΠΈ ΡΠΎ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΌΠ°Π³ΠΈΡΡΡΠ°Π»Π°:
ΠΠΎ, ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠ° ΠΏΠΎΡΡΠΎΡΡΠ²Π°ΡΠΎΡ:
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();
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΎΠ²Π°Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π² ΠΌΠ°Π³ΠΈΡΡΡΠ°Π»Π°ΡΠ° Π²ΠΎ ΠΌΠΎΡΠΎΡ Π·Π°Π΄Π΅Π½ Π΄Π΅Π», Π³ΠΈ ΠΎΠ΄Π΄Π΅Π»ΠΈΠ² ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΠΎΠ΄ ΡΡΠ°ΡΠ°ΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΠ² ΠΏΠΎΡΠ΅Π±Π½ΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ ΡΠ΅ΠΊΠΎΡ ΡΠΈ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠ²ΠΎΠ΅ΡΠΎ.
ΠΠ°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ Π·Π° Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ²Π° Π»ΠΎΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠ΅ Π²Π°ΠΊΠ°:
Π Π²Π΅Π΄Π½Π°Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ°, ΠΌΠΈ ΡΡΠ°Π½Π° ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ»Π΅ΡΠ½ΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ Π½ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·Π²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ ΠΈ ΠΏΠ°ΡΡΠΈΡΠ°ΡΠ΅ Rss. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ° Π±Π°ΡΠ° ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°, Π° ΠΏΠΎΡΠΎΠ° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠΎΡ Π·Π° ΠΈΠ·Π²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ Π½Π° RSS Π²ΡΡΠΊΠΈ, ΠΊΠ°ΠΊΠΎ WebsiteIndexHistoryPersistor, ΡΠ΅ ΠΏΡΠ΅ΡΠΏΠ»Π°ΡΠΈ Π½Π° ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ° βΠ‘ΠΎΠ΄ΡΠΆΠΈΠ½Π°/HtmlContentβ, ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π° ΠΈ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ ΡΠ° ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° ΡΠ°ΠΊΠ°Π½Π°ΡΠ° ΠΏΠΎΡΠ°ΠΊΠ° ΠΏΠΎ Π΄ΠΎΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°.
ΠΠ° ΠΊΡΠ°ΡΠΎΡ, Π·Π°Π²ΡΡΠΈΠ²ΠΌΠ΅ ΡΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄Π΅ΠΌΠΎΠ½ΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ΡΠΆΡΠ²Π° Π²ΡΡΠΊΠΈ ΡΠ°ΠΌΠΎ ΡΠΎ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ ΡΠΎΠ±ΠΎΡΠΈ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΈΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠΈ ΠΊΠΎΠΈ Π±Π°ΡΠ°Π°Ρ ΠΎΠ΄Π΅ΡΠ΅ Π½Π° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π° ΠΈ Π΄Π΅ΠΌΠΎΠ½ΠΎΡ ΠΎΠΏΡΡΠΎΡΡΠ²Π°Π°Ρ ΠΈΠΌΠ° Π²ΡΡΠΊΠ° ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
Π‘Π΅Π³Π°, Π½Π°ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΠΈΡΠ° ΠΎΠ΄ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ ΠΏΠΎ Π²ΠΌΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ ΠΎΠ΄ ΡΡΡΠ°Π½Π° Π½Π° ΠΏΠ΅ΡΡΠΈΡΡΠ΅Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°Π°Ρ ΠΏΡΠ΅ΠΊΡ ΠΌΠ°Π³ΠΈΡΡΡΠ°Π»Π°ΡΠ° Π΄ΠΎ ΡΠΈΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΊΡΠ²Π°ΡΠΈ.
ΠΠ·Π²ΠΎΡ: www.habr.com