«PHP کند است» — این جمله سالها با هر نسخهٔ جدید PHP ضعیفتر شده و امروز دیگر تقریباً نادرست است. با ظهور PHP 8 و سپس PHP 8.5، سرعت زبان PHP به شکل چشمگیری افزایش یافته. اما محدودیت اصلی همیشه نه در زبان، بلکه در معماری اجرای کلاسیک آن بود: هر درخواست، برنامه را از صفر بالا میآورد و بعد از پاسخ، همهچیز نابود میشد.
در سالهای اخیر ابزارهایی ظهور کردهاند که این معماری را از پایه تغییر میدهند: Laravel Octane برای ماندگاری اپلیکیشن در حافظه، FrankenPHP به عنوان سرور اپلیکیشن مدرن مبتنی بر Go و Laravel Reverb برای ارتباط بلادرنگ. در این مقاله به این سه تکنولوژی و مقایسهٔ آنها با معماری سنتی PHP-FPM میپردازیم.
مشکل معماری کلاسیک PHP-FPM
در معماری سنتی، وبسرور Nginx درخواست را به PHP-FPM میسپارد؛ FPM یک فرآیند PHP را بیدار میکند، کد را از ابتدا ترجمه و بارگذاری میکند، اتصال دیتابیس را برقرار میکند و بعد از تولید پاسخ، همهچیز را دور میریزد. هر درخواست یعنی راهاندازی مجدد کامل فریمورک: bootstrap فریمورک، خواندن کانفیگها، سرویسپروایدرها، اتصالها و کشهای داغ.
نتیجهٔ این طراحی این است که بخش بزرگی از زمان پاسخگویی صرف کاری میشود که در هر درخواست یکسان است. این همان دلیلی است که PHP را «کند» معرفی میکرد — نه زبان، بلکه معماری.
Laravel Octane — اپلیکیشن ماندگار در حافظه
Laravel Octane پکیج رسمی لاراول است که اپلیکیشن را یک بار در حافظه بارگذاری میکند و سپس درخواستهای بعدی را بدون راهاندازی مجدد پردازش میکند. اکتان از دو سرور اپلیکیشن پشتیبانی میکند:
- RoadRunner — سرور مبتنی بر Go که فرآیندهای PHP را به صورت ماندگار مدیریت میکند
- Swoole — پسوند PHP با پشتیبانی از برنامهنویسی غیرهمزمان و حافظهٔ مشترک
نتیجهٔ این معماری، بهبود چشمگیر عملکرد است: بنچمارکها در حالت عادی ۱۰ تا ۳۰ برابر سریعتر بودن پاسخدهی را در مقایسه با PHP-FPM نشان میدهند. چون bootstrap دیگر انجام نمیشود، کانفیگها و سرویسها در حافظه میمانند و اتصالهای دیتابیس و Redis باز استفاده میشوند.
composer require laravel/octane
php artisan octane:install --server=roadrunner
php artisan octane:start --server=roadrunner --port=8000نکتهٔ مهم: با Octane باید از نگهداشتن state در حافظهٔ استاتیک و session خودداری کرد، چون اپلیکیشن بین درخواستها زنده میماند. لاراول برای این کار مسیرهای (coordinate) مشخصی دارد و ابزارهایی مثل Cache و تزریق وابستگی برای این معماری بهینه شدهاند.
FrankenPHP — سرور اپلیکیشن مبتنی بر Go
FrankenPHP یک سرور اپلیکیشن مدرن و متنباز برای PHP است که درون یک باینری Go ساخته شده و با سرعت و قابلیتهای Go ترکیب شده است. این پروژه توسط تیم توسعهدهندگان Caddy و Symfony ساخته شده و به عنوان ستون فقرات معماری Symfony به کار میرود.
ویژگیهای کلیدی FrankenPHP:
- Worker Mode — اپلیکیشن PHP یک بار در حافظه بارگذاری میشود و درخواستها را به صورت موازی پردازش میکند (دقیقاً همان ایدهٔ Octane، ولی یکپارچهتر)
- سرور وب داخلی — نیازی به Nginx جدا نیست؛ FrankenPHP خودش HTTPS، HTTP/2/3 و static file serving را مدیریت میکند
- Early Hints — با ارسال پاسخهای 103 Early Hints، مرورگر را زودتر برای دریافت فایلهای حیاتی بیدار میکند
- Mercure و محور بلادرنگ — پشتیبانی توکار از پروتکل Mercure برای ارتباط بلادرنگ بین سرور و مرورگر
- گواهی خودکار — صدور و تمدید خودکار گواهی TLS با استفاده از Caddy
ترکیب Octane + FrankenPHP در لاراول هم کاملاً پشتیبانی میشود: اکتان فرانتاند (frontend) به FrankenPHP متصل میشود و هر دو به صورت یک باینری اجرا میشوند — یعنی یک سرور واحد که هم PHP را سرو میکند، هم استاتیکها را، هم HTTPS را.
Laravel Reverb — سرور WebSocket رسمی
Laravel Reverb سرور WebSocket رسمی و فوقسریع لاراول است که از نسخهٔ ۱۱ به بعد در دسترس قرار گرفت. پیش از Reverb، برای قابلیتهای بلادرنگ باید از سرویسهای خارجی مثل Pusher یا Ably استفاده میکردید یا Soketi را خودتان راهاندازی میکردید. Reverb همهٔ اینها را به داخل اکوسیستم لاراول میآورد.
ویژگیهای کلیدی Reverb:
- یکپارچه با Redis — Reverb از Redis برای انتشار رویدادها (Pub/Sub) استفاده میکند و با Broadcasting لاراول یکپارچه است
- عملکرد بالا — مبتنی بر ReactPHP است و هزاران اتصال همزمان WebSocket را با مصرف منابع پایین مدیریت میکند
- راهاندازی ساده — فقط یک دستور:
php artisan reverb:start - اسکیلپذیری افقی — با چند نمونهٔ Reverb و Redis Pub/Sub میتوان اتصالها را در چند سرور پخش کرد
- کنترل کامل — بدون وابستگی به سرویس ابری خارجی و پرداخت هزینهٔ هر اتصال
با ترکیب Reverb + Livewire میتوان اعلانهای زنده، دشبوردهای لحظهای، چت و هر UI بلادرنگ را بدون نوشتن جاوااسکریپت پیچیده ساخت.
مقایسه PHP-FPM با Octane و FrankenPHP
بیایید سه رویکرد اجرای PHP را کنار هم ببینیم:
| ویژگی | PHP-FPM (کلاسیک) | Laravel Octane | FrankenPHP |
|---|---|---|---|
| عمر فرآیند | کوتاه — هر درخواست از صفر | طولانی — bootstrap یک بار | طولانی — Worker Mode |
| زبان سرور | C (پسوند PHP) | Go (RoadRunner) یا C (Swoole) | Go |
| سرعت پاسخگویی | پایه (مرجع) | ۱۰ تا ۳۰ برابر سریعتر | مشابه Octane |
| نیاز به Nginx | بله | بله (یا سرور دیگری) | خیر — سرور وب داخلی |
| HTTPS و HTTP/2/3 | از طریق Nginx | از طریق Nginx | توکار و خودکار |
| Early Hints | محدود | محدود | توکار |
| سازگاری | با همهٔ کدها | فقط لاراول و Lumen | هر اپلیکیشن PHP (با worker سازگار) |
| پیچیدگی راهاندازی | ساده | متوسط — نیاز به تنظیمات | ساده — یک باینری |
موارد استفاده
- APIهای پرترافیک — با Octane یا FrankenPHP، هر میلیثانیهای که از bootstrap کم شود، به معنای ظرفیت بیشتر و هزینهٔ کمتر است
- اپلیکیشنهای بلادرنگ — Reverb برای چت، اعلان، دشبورد زنده و همکاری همزمان تیمی
- پروژههایی که دیتابیس سنگین دارند — استفادهٔ مجدد از اتصالها در Octane فشار روی MySQL/PostgreSQL را بهطور محسوس کم میکند
- هاستینگهای کممنابع — FrankenPHP به تنهایی (بدون Nginx) منابع کمتری مصرف میکند
- ارتقای یک پروژهٔ لاراولی موجود — Octane بدون بازنویسی کد، سرعت را به پروژهٔ فعلی میدهد
چه زمانی از این ابزارها استفاده کنیم؟
- ترافیک پروژه رو به رشد است و زمان پاسخگویی (TTFB) مهم شده است
- نیاز به کاهش هزینهٔ زیرساخت دارید — سرورهای کمتر با ظرفیت بیشتر
- ویژگیهای بلادرنگ به محصول اضافه میشود (اعلان، چت، دشبورد زنده)
- تیم شما با لاراول کار میکند و میخواهد بدون تغییر زبان عملکرد را چند برابر کند
- به راهاندازی ساده و همهکاره نیاز دارید که خودش HTTPS و فایلهای استاتیک را هم مدیریت کند (FrankenPHP)
برای چه چیزهایی مناسب نیستند؟
- اپلیکیشنهایی با حافظهٔ وضعیت (Stateful) بیانضباط — کدهایی که داده را در متغیرهای استاتیک نگه میدارند، با Octane/FrankenPHP رفتار غیرقابل پیشبینی خواهند داشت
- پروژههای کوچک و کمترافیک — اگر ترافیک پایین است، پیچیدگی Octane توجیه ندارد؛ PHP-FPM ساده و قابل اعتماد است
- برنامههای غیر لاراولی برای Octane — Octane مخصوص اکوسیستم لاراول است؛ برای بقیهٔ PHP، FrankenPHP یا RoadRunner مستقیم بهتر است
- محاسبات سنگین CPU — هیچکدام از این ابزارها مشکل CPU-bound بودن PHP را حل نمیکنند؛ برای آنها Go، Rust یا سرویسهای اختصاصی مناسباند
- تیم بدون تجربهٔ زیرساخت — اشکالزدایی workerهای ماندگار (memory leak، state مشترک) به دانش بیشتری نیاز دارد
لکسویا در سرویس پلتفرم ابری (PaaS) خود از این تکنولوژی پشتیبانی میکند — با چند کلیک دپلوی کنید.
نتیجهگیری
افسانهٔ «PHP کند است» با معماریهای مدرن اجرا، عملاً منسوخ شده است. Laravel Octane با نگهداشتن اپلیکیشن در حافظه (۱۰ تا ۳۰ برابر سرعت بیشتر)، FrankenPHP با سرور همهکارهٔ مبتنی بر Go (worker mode، HTTPS خودکار، Early Hints) و Laravel Reverb با WebSocket بومی، پازل عملکرد و بلادرنگ را در اکوسیستم PHP کامل میکنند.
این ابزارها هزینهٔ زیرساخت را کاهش میدهند و تجربهٔ کاربری را بهبود میبخشند، اما انتخاب آنها نیازمند درک معماری workerهای ماندگار است. برای پروژههای لاراولی در حال رشد، Octane و Reverb نقطهٔ شروع ایدهآلی هستند و FrankenPHP جایگزین مدرن و سادهتری برای کل چیدمان Nginx + FPM است.