RoadRunner: PHP Π½Π΅ создан, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠΈΡ€Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ Golang ΡΠΏΠ΅ΡˆΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ

RoadRunner: PHP Π½Π΅ создан, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠΈΡ€Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ Golang ΡΠΏΠ΅ΡˆΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! ΠœΡ‹ Π² Badoo Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ PHP, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас достаточно большая систСма Π½Π° этом языкС ΠΈ вопрос ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” это вопрос экономии Π΄Π΅Π½Π΅Π³. Π‘ΠΎΠ»Π΅Π΅ дСсяти Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ ΠΌΡ‹ создали для этого PHP-FPM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сначала прСдставлял собой Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ для PHP, Π° ΠΏΠΎΠ·ΠΆΠ΅ Π²ΠΎΡˆΡ‘Π» Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ поставку.

Π—Π° послСдниС Π³ΠΎΠ΄Ρ‹ PHP сильно продвинулся Π²ΠΏΠ΅Ρ€Ρ‘Π΄: ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΡΡ сборщик мусора, повысился ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” сСгодня Π½Π° PHP ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π΅ΠΌΠΎΠ½Ρ‹ ΠΈ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ скрипты. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Spiral Scout ΠΏΠΎΠΉΡ‚ΠΈ дальшС: RoadRunner, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ PHP-FPM, Π½Π΅ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ запросами, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (хотя этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈ  услоТняСт процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ). ΠœΡ‹ сСйчас экспСримСнтируСм с этим инструмСнтом, Π½ΠΎ Ρƒ нас ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΡ… Π±Ρ‹Π»ΠΎ вСсСлСС, ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ анонса RoadRunner ΠΎΡ‚ Spiral Scout.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π°ΠΌ Π±Π»ΠΈΠ·ΠΎΠΊ: ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ своих Π·Π°Π΄Π°Ρ‡ ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ связку PHP ΠΈ Go, получая прСимущСства ΠΎΡ‚ ΠΎΠ±ΠΎΠΈΡ… языков ΠΈ Π½Π΅ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°ΡΡΡŒ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

Enjoy!

Π’ послСдниС Π΄Π΅ΡΡΡ‚ΡŒ Π»Π΅Ρ‚ ΠΌΡ‹ создавали прилоТСния ΠΈ для ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΈΠ· списка Fortune 500, ΠΈ для бизнСса с Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 500 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Всё это врСмя наши ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄ прСимущСствСнно Π½Π° PHP. Но Π΄Π²Π° Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ сильно повлияло Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², Π½ΠΎ ΠΈ Π½Π° ΠΈΡ… ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ β€” ΠΌΡ‹ Π²Π²Π΅Π»ΠΈ Golang (Go) Π² наш стСк Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.

ΠŸΠΎΡ‡Ρ‚ΠΈ сразу ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Go позволяСт Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ прилоТСния с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎ 40 Ρ€Π°Π·. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Π³ΠΎ ΠΌΡ‹ смогли Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹, написанныС Π½Π° PHP, ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ ΠΈΡ… благодаря ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ прСимущСств ΠΎΠ±ΠΎΠΈΡ… языков.

ΠœΡ‹ расскаТСм, ΠΊΠ°ΠΊ связка Go ΠΈ PHP ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ для нас Π² инструмСнт, способный ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚ части ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с модСлью «умирания» PHP.

Π’Π°ΡˆΠ° повсСднСвная срСда PHP-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Go ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ²ΠΈΡ‚ΡŒ модСль «умирания» PHP, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π²Π°ΡˆΡƒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ срСду PHP-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π²Ρ‹ запускаСтС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π²Π΅Π±-сСрвСра nginx ΠΈ сСрвСра PHP-FPM. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ обслуТиваСт статичныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ пСрСнаправляСт Π² PHP-FPM спСцифичСскиС запросы, Π° сам PHP-FPM исполняСт PHP-ΠΊΠΎΠ΄. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΡƒΡŽ связку ΠΈΠ· Apache ΠΈ mod_php. Но хотя ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ‚Π΅ ΠΆΠ΅.

Рассмотрим, ΠΊΠ°ΠΊ PHP-FPM исполняСт ΠΊΠΎΠ΄ прилоТСния. Когда ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ запрос, PHP-FPM ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ PHP-процСсс, Π° Π΄Π΅Ρ‚Π°Π»ΠΈ запроса ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ состояния (_GET, _POST, _SERVER ΠΈ Ρ‚. Π΄.).

БостояниС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ…ΠΎΠ΄Π΅ исполнСния PHP-скрипта, поэтому ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ способом: очистив ΠΏΠ°ΠΌΡΡ‚ΡŒ процСсса ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π² Π΅Π³ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ.

Π£ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ исполнСния ΠΌΠ½ΠΎΠ³ΠΎ прСимущСств. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ сильно Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠΈ памяти, всС процСссы ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, ΠΈ Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Β«ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚Β», Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски воссоздан ΠΈ это Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅Ρ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ процСссы. Но Π΅ΡΡ‚ΡŒ Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈ нСдостатки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

НСдостатки ΠΈ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ PHP-срСды

Если Π²Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π½Π° PHP, Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅, с Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, β€” с Π²Ρ‹Π±ΠΎΡ€Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. Он прСдставляСт собой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для внСдрСния зависимостСй, ORM’ы, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Symfony/HttpFoundation ΠΈΠ»ΠΈ PSR-7). Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ β€” это ΠΊΠ»Ρ‘Π²ΠΎ!

Но Ρƒ всСго Π΅ΡΡ‚ΡŒ своя Ρ†Π΅Π½Π°. Π’ любом Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ энтСрпрайз-уровня для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ простого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ запроса ΠΈΠ»ΠΈ обращСния ΠΊ Π‘Π” придётся Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ дСсятки Ρ„Π°ΠΉΠ»ΠΎΠ², ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ многочислСнныС классы ΠΈ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ нСсколько ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Но Ρ…ΡƒΠΆΠ΅ всСго Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ послС выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ всё ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ: вСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ ΠΊΠΎΠ΄ становится бСсполСзСн, с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹ ΡƒΠΆΠ΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ запрос. Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΎΠ± этом Π»ΡŽΠ±ΠΎΠΌΡƒ программисту, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, β€” ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π³ΠΎ Π»ΠΈΡ†Π΅.

PHP-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Π³ΠΎΠ΄Π°ΠΌΠΈ искали способы Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, использовали ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ Β«Π»Π΅Π½ΠΈΠ²ΠΎΠΉΒ» Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΌΠΈΠΊΡ€ΠΎΡ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, кСш ΠΈ Ρ‚. Π΄. Но Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ всё Ρ€Π°Π²Π½ΠΎ приходится ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ всё ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ сначала, ΠΎΠΏΡΡ‚ΡŒ ΠΈ ΠΎΠΏΡΡ‚ΡŒ. (ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: частично эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½Π° с появлСниСм preload Π² PHP 7.4)

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ PHP с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Go ΠΏΠ΅Ρ€Π΅ΠΆΠΈΡ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса?

МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ PHP-скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΆΠΈΠ²ΡƒΡ‚ дольшС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ½ΡƒΡ‚ (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ часов ΠΈΠ»ΠΈ Π΄Π½Π΅ΠΉ): Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, cron-Π·Π°Π΄Π°Ρ‡ΠΈ, CSV-парсСры, Ρ€Π°Π·Π±ΠΎΡ€Ρ‰ΠΈΠΊΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ. ВсС ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ: ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ Π·Π°Π΄Π°Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π΅Π³ΠΎ, ΠΆΠ΄ΡƒΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Код постоянно находится Π² памяти, экономя Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ миллисСкунды, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΈ прилоТСния трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий.

Но Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ скрипты Π½Π΅ Ρ‚Π°ΠΊ просто. Π›ΡŽΠ±Π°Ρ ошибка ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ процСсс, диагностика ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π΄ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ Π±Π΅ΡˆΠ΅Π½ΡΡ‚Π²Π°, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΠΎ F5 ΡƒΠΆΠ΅ нСльзя.

Битуация ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»Π°ΡΡŒ с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ PHP 7: появился Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ сборщик мусора, стало Π»Π΅Π³Ρ‡Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки, Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ядра Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ. ΠŸΡ€Π°Π²Π΄Π°, ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ всё Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½ΠΎ остороТно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… состояния Π² ΠΊΠΎΠ΄Π΅ (Π° сущСствуСт Π»ΠΈ язык, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ этим Π²Π΅Ρ‰Π°ΠΌ?). И всё ΠΆΠ΅ Π² PHP 7 нас подстСрСгаСт мСньшС нСоТиданностСй.

МоТно Π»ΠΈ Π²Π·ΡΡ‚ΡŒ модСль Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΌΠΈ PHP-скриптами, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ ΠΏΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ HTTP-запросов ΠΈ Ρ‚Π΅ΠΌ самым ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ нСобходимости Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ всё с нуля ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС?

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ сначала Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, способноС ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ HTTP-запросы ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ PHP-Π²ΠΎΡ€ΠΊΠ΅Ρ€Ρƒ, Π½Π΅ убивая Π΅Π³ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.

ΠœΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ смоТСм Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π΅Π±-сСрвСр Π½Π° чистом PHP (PHP-PM) ΠΈΠ»ΠΈ с использованиСм Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ (Swoole). И хотя Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ способа Π΅ΡΡ‚ΡŒ свои достоинства, ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° нас Π½Π΅ устраивали β€” Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ большСго. НуТСн Π±Ρ‹Π» Π½Π΅ просто Π²Π΅Π±-сСрвСр β€” ΠΌΡ‹ рассчитывали ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, способноС ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ нас ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с «тяТёлым стартом» Π² PHP, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прилоТСния. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π±Ρ‹Π» сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Go ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² этом? ΠœΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ этот язык ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ прилоТСния Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹; ΠΎΠ½ кроссплатформСнный; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ, ΠΎΡ‡Π΅Π½ΡŒ ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΡƒΡŽ, модСль ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (concurrency) ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с HTTP; ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ доступны тысячи open-source-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΉ.

Врудности объСдинСния Π΄Π²ΡƒΡ… языков программирования

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

НапримСр, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСкрасной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ АлСкса ΠŸΠ°Π»Π°ΡΡΡ‚Ρ€Π°ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстноС использованиС памяти процСссами PHP ΠΈ Go (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ mod_php Π² Apache). Но эта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ особСнностями, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ Π΅Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нашСй Π·Π°Π΄Π°Ρ‡ΠΈ.

ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π±ΠΎΠ»Π΅Π΅ распространённый, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Ρ‡Π΅Ρ€Π΅Π· сокСты/ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π° послСдниС дСсятилСтия Π΄ΠΎΠΊΠ°Π·Π°Π» свою Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π±Ρ‹Π» Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создали нСслоТный Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ. Π’ своСй ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» этого Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡ…ΠΎΠΆ Π½Π° netstring с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Π² нашСм случаС 17 Π±Π°ΠΉΡ‚), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ маску для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ цСлостности Π΄Π°Π½Π½Ρ‹Ρ….

На сторонС PHP ΠΌΡ‹ использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pack, Π° Π½Π° сторонС Go β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ encoding/binary.

Одного ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π°ΠΌ показалось ΠΌΠ°Π»ΠΎ β€” ΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Go-сСрвисы net/rpc прямо ΠΈΠ· PHP. ПозднСС Π½Π°ΠΌ это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Go-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² PHP-прилоТСния. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ нашСм open-source-ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ Goridge.

РаспрСдСлСниС Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ нСскольким PHP-Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°ΠΌ

ПослС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° взаимодСйствия ΠΌΡ‹ стали Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ эффСктивнСС всСго ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ PHP-процСссам. Когда ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π·Π°Π΄Π°Ρ‡Π°, сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для Π΅Ρ‘ выполнСния свободный Π²ΠΎΡ€ΠΊΠ΅Ρ€. Если Π²ΠΎΡ€ΠΊΠ΅Ρ€/процСсс Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ с ошибкой ΠΈΠ»ΠΈ Β«ΡƒΠΌΠ΅Ρ€Β», ΠΌΡ‹ избавляСмся ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΈ создаём Π½ΠΎΠ²Ρ‹ΠΉ Π²Π·Π°ΠΌΠ΅Π½. А Ссли Π²ΠΎΡ€ΠΊΠ΅Ρ€/процСсс ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΏΡƒΠ» Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ², доступных для выполнСния Π·Π°Π΄Π°Ρ‡.

RoadRunner: PHP Π½Π΅ создан, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠΈΡ€Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ Golang ΡΠΏΠ΅ΡˆΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ

Для хранСния ΠΏΡƒΠ»Π° Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ² ΠΌΡ‹ использовали Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», для удалСния ΠΈΠ· ΠΏΡƒΠ»Π° Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Β«ΡƒΠΌΠ΅Ρ€ΡˆΠΈΡ…Β» Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ² Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ отслСТивания ошибок ΠΈ состояний Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ².

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ PHP-сСрвСр, способный ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ запросы, прСдставлСнныС Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Π΅Π±-сСрвСр, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ PHP-стандарт для прСдставлСния Π»ΡŽΠ±Ρ‹Ρ… входящих HTTP-запросов. Π’ нашСм случаС ΠΌΡ‹ просто ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ net/http-запрос ΠΈΠ· Go Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ PSR-7, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» совмСстим с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ доступных сСгодня PHP-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ².

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ PSR-7 считаСтся нСизмСняСмым (ΠΊΡ‚ΠΎ-Ρ‚ΠΎ скаТСт, Ρ‡Ρ‚ΠΎ тСхничСски это Π½Π΅ Ρ‚Π°ΠΊ), Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ с запросом ΠΊΠ°ΠΊ с глобальной ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΎ прСкрасно сочСтаСтся с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΡ… PHP-процСссов. Наша Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ рСализация, которая Π΅Ρ‰Ρ‘ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° названия, выглядСла Ρ‚Π°ΠΊ:

RoadRunner: PHP Π½Π΅ создан, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠΈΡ€Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ Golang ΡΠΏΠ΅ΡˆΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ RoadRunner β€” Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр PHP-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

НашСй ΠΏΠ΅Ρ€Π²ΠΎΠΉ тСстовой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ стал API-Π±Π΅ΠΊΠ΅Π½Π΄, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ пСриодичСски нСпрСдсказуСмо Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ всплСски запросов (Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‡Π°Ρ‰Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ). Π₯отя Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв возмоТностСй nginx Π±Ρ‹Π»ΠΎ достаточно, ΠΌΡ‹ рСгулярно ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с ошибкой 502, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ достаточно быстро Π±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСму ΠΏΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

Для Π·Π°ΠΌΠ΅Π½Ρ‹ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π² Π½Π°Ρ‡Π°Π»Π΅ 2018 Π³ΠΎΠ΄Π° ΠΌΡ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ наш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ PHP/Go-сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. И сразу ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ нСвСроятный эффСкт! ΠœΡ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ избавились ΠΎΡ‚ ошибки 502, Π½ΠΎ Π΅Ρ‰Ρ‘ ΠΈ смогли Π½Π° Π΄Π²Π΅ Ρ‚Ρ€Π΅Ρ‚ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство сСрвСров, сэкономив ΠΊΡƒΡ‡Ρƒ Π΄Π΅Π½Π΅Π³ ΠΈ Ρ‚Π°Π±Π»Π΅Ρ‚ΠΎΠΊ ΠΎΡ‚ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ для ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ².

К сСрСдинС Π³ΠΎΠ΄Π° ΠΌΡ‹ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ нашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π½Π° GitHub ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT ΠΈ Π½Π°Π·Π²Π°Π»ΠΈ RoadRunner, ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΠ² Ρ‚Π΅ΠΌ самым Π΅Π³ΠΎ Π½Π΅Π²Π΅Ρ€ΠΎΡΡ‚Π½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

Как RoadRunner ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ваш стСк Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ RoadRunner ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Middleware net/http Π½Π° сторонС Go, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ JWT-Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π΅Ρ‰Ρ‘ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ запрос ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² PHP, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ WebSockets ΠΈ глобально Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояния Π² Prometheus.

Благодаря встроСнному RPC ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ API Π»ΡŽΠ±Ρ‹Ρ… Go-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для PHP Π±Π΅Π· написания ΡΠΊΡΡ‚Π΅Π½ΡˆΠ΅Π½ΠΎΠ²-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ. Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Π²Π°ΠΆΠ½Π΅Π΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ RoadRunner ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ сСрвСры, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΡ‚ HTTP. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ привСсти запуск Π² PHP ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² AWS Lambda, созданиС Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Ρ… Ρ€Π°Π·Π±ΠΎΡ€Ρ‰ΠΈΠΊΠΎΠ² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ ΠΈ Π΄Π°ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ gRPC Π² наши прилоТСния.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сообщСств PHP ΠΈ Go ΠΌΡ‹ повысили ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… тСстах ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎ 40 Ρ€Π°Π·, ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ инструмСнты ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ Symfony ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ HTTPS, HTTP/2, ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΈ PSR-17.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НСкоторыС всё Π΅Ρ‰Ρ‘ находятся Π² ΠΏΠ»Π΅Π½Ρƒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π³ΠΎ прСдставлСния ΠΎ PHP ΠΊΠ°ΠΊ ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΌ языкС, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для написания ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ΄ WordPress. Π­Ρ‚ΠΈ люди Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ PHP Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ становится достаточно большим, приходится Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Β«Π·Ρ€Π΅Π»Ρ‹ΠΉΒ» язык ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΊΠΎΠΏΠΈΠ²ΡˆΡƒΡŽΡΡ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ Π±Π°Π·Ρƒ ΠΊΠΎΠ΄Π°.

На всё это хочСтся ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ: ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ Π΅Ρ‰Ρ‘ Ρ€Π°Π·. ΠœΡ‹ считаСм, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ сами Π·Π°Π΄Π°Ρ‘Ρ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ограничСния для PHP. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ всю Тизнь Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π½Π°ΠΉΡ‚ΠΈ идСальноС сочСтаниС с вашими потрСбностями, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ языки ΠΊΠ°ΠΊ инструмСнты. ΠœΠ½ΠΈΠΌΡ‹Π΅ нСдостатки языка Π²Ρ€ΠΎΠ΄Π΅ PHP Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ Π΅Π³ΠΎ успСха. А Ссли ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ языком Π²Ρ€ΠΎΠ΄Π΅ Go, Ρ‚ΠΎ Π²Ρ‹ создадитС Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ Π²Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ»ΠΈΡΡŒ использованиСм ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка.

ΠŸΠΎΡ€Π°Π±ΠΎΡ‚Π°Π² со связкой Go ΠΈ PHP, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ полюбили ΠΈΡ…. ΠœΡ‹ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ способы ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΅Ρ‰Ρ‘ большС ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΈΠ· этого Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ стСка.

UPD: привСтствуСм создатСля RoadRunner ΠΈ соавтора ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” Lachezis

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com