
از mod_php تا رانتایمهای مدرن: شیرجهای عمیق در SAPIهای PHP 🧠⚙️
تکامل PHP از یک اسکریپت ساده به سرورهای اپلیکیشن سازمانی، داستان SAPIهاست — واسطهای برنامهنویسی سرور که تعریف میکنند دنیای بیرون چطور با PHP حرف بزند. اینجا به ترتیب تاریخ پیدایش بررسیشان میکنیم، با دانش کامپیوتری که واقعاً مهم است. 🔍
---
🧾 واژهنامه سریع (اصطلاحات سنگین، توضیح سبک)
· SAPI – لایهای که وبسرور را به موتور PHP وصل میکند.
· Shared‑Nothing (حافظه مشترک صفر) – هر درخواست در پروسهای کاملاً ایزوله اجرا میشود؛ هیچ دادهای بین درخواستها باقی نمیماند.
· OPcache – کش اپکدهای کامپایلشده PHP در حافظه مشترک (mmap) تا اسکریپتها دوباره کامپایل نشوند.
· Worker – پروسهای با عمر طولانی که مکرراً جاب (درخواست) میگیرد و پردازش میکند.
· Event Loop – حلقهای که منتظر رویدادهای I/O میماند و بدون قفل کردن کل پروسه، آنها را توزیع میکند.
· Coroutine (همروتین) – واحد اجرایی سبک و تعاونی که در نقاط I/O متوقف و از سر گرفته میشود — ترد نیست.
· Blocking I/O – وقتی پروسه تا اتمام یک فراخوان سیستمی (مثل کوئری دیتابیس) کاملاً فریز میشود.
· Bootstrap – هزینه راهاندازی فریمورک (لود کلاسها، کانتینر، مسیرها) — یک بار یا هر درخواست.
---
۱. Apache + mod_php 🦖 (۱۹۹۸)
PHP مستقیماً داخل فضای حافظه Apache جاسازی میشد. بدون سربار IPC — سریع برای اسکریپتهای کوچک.
🔬 هر فرزند Apache کل موتور PHP را لود میکرد، حتی برای فایلهای استاتیک. مدل «یک پروسه = یک درخواست» به دیوار C10k خورد. برای worker MPM نیاز به ZTS بود که کلی افزونه را ناپایدار میکرد.
✨ نقطه طلایی: سادگی. بدون پیکربندی، راه میافتد.
---
۲. CGI / FastCGI 🌉 (اوایل ۲۰۰۰)
CGI برای هر درخواست یک پروسه جدید میساخت — فاجعه از نظر سرعت، بدون OPcache. اما یک ایده حیاتی را اثبات کرد: جدایی وبسرور از PHP. FastCGI پروسهها را زنده نگه داشت و سربار fork را حذف کرد.
---
۳. PHP‑FPM ⚡ (۲۰۱۱ - رسمی در هسته)
وقتی nginx با event loop ناهمگامش آمد، نیاز به یک مدیر پروسه مستقل برای PHP داشت. FPM دقیقاً همین است: مستر پروسهها را فورک میکند، یک استخر Worker میسازد، و با پروتکل FastCGI روی سوکت Unix یا TCP صحبت میکند.
🧠 OPcache یک بار در مستر کامپایل میشود، فرزندها از طریق mmap ارث میبرند. ریلود بدون قطعی با SIGUSR2.
✨ نقطه طلایی: امنیت Shared‑Nothing. یک Worker = یک درخواست. نشت حافظه فقط همان یک درخواست را میکشد.
🚫 محدودیت: Workerها روی I/O بلاک میشوند. ۵۰ Worker + ۵۰ کوئری کند = همه فریز.
---
۴. Swoole 🔄 (۲۰۱۲)
یک افزونه PHP که PHP را به سرور اپلیکیشن همروتینمحور و رویدادگرا تبدیل میکند. بدون نیاز به وبسرور خارجی.
🧠 Event Loop داخلی با epoll. همروتینهای Stackful که روی I/O متوقف میشوند و با رسیدن داده از سر گرفته میشوند. یک Worker میتواند هزاران همروتین همزمان داشته باشد. حافظه ماندگار: Connection Poolها بین درخواستها زنده میمانند.
✨ نقطه طلایی: همروتینها + Event Loop = C10M روی یک ماشین.
⚠️ هزینه: باید کد non‑blocking بنویسید. حافظه مشترک یعنی مسئولیت data race با خودتان است.
---
۵. RoadRunner 🏎️ (۲۰۱۷)
فلسفه متفاوت: PHP را در منطقه امنش نگه دار، از Go مدیریتش کن.
🧩 سرور اصلی با Go نوشته شده. Workerها پروسههای PHP CLI هستند که فریمورک را یک بار لود میکنند، سپس در حلقه بینهایت جاب میگیرند. ارتباط از طریق پروتکل goridge روی pipe.
✨ نقطه طلایی: Hot Bootstrap. فریمورک یک بار لود میشود، هزاران درخواست را هندل میکند. ۴ تا ۱۰ برابر توانعملیاتی نسبت به FPM.
💡 Go کارهای سخت را میکند — TLS, HTTP/2, WebSocket. PHP فقط منطق بیزینس.
---
۶. FrankenPHP 🧟♂️ (۲۰۲۲)
نقطه همگرایی: وبسرور Caddy + PHP در یک باینری یکتا.
⚙️ دو حالت:
۱. کلاسیک — مثل FPM، استخر Worker با FastCGI.
۲. Worker Mode — اسکریپت PHP CLI زنده میماند، Caddy درخواستها را با پروتکل کوچکی ارسال میکند. FastCGI دور زده میشود.
✨ نقطه طلایی: بهترین هر دو دنیا. ساده شروع کن، بعداً سریع شو. HTTPS خودکار، HTTP/3، باینری یکتا — رؤیای DevOps.
---
🎯 تایملاین (به ترتیب تاریخ)
۱. mod_php — جاسازیشده، پادشاه سادگی.
۲. FastCGI — آغاز جدایی.
۳. PHP‑FPM — استخر پروسه، امنیت Shared‑Nothing.
۴. Swoole — موتور همروتینی، PHP ناهمگام.
۵. RoadRunner — Workerهای مدیریتشده با Go، Hot Bootstrap.
۶. FrankenPHP — سرور هیبریدی، باینری یکتا.
---
🧠 تغییر بنیادین علم کامپیوتر
از «یک پروسه = یک درخواست» با I/O بلاکشونده → به «استخر پروسه × Event Loop/همروتین»
· FPM: امن، اما بلاک روی I/O.
· Swoole: حداکثر همروندی، ریسک حالت مشترک.
· RoadRunner / FrankenPHP worker mode: PHP بلاک میماند، Event Loop سرور (Go/Caddy) مالتیپلکس میکند. Hot Bootstrap بدون بازنویسی کد.
PHP CLI SAPI اکنون ستون فقرات PHP مدرن است — PHP را زنده نگه دار، وبسرور فقط یک پروکسی نازک میشود.
---
#PHP #SAPI #PHPFPM #Swoole #RoadRunner #FrankenPHP #Backend #SeniorDev #ComputerScience #Coroutines #EventLoop #Nginx #SharedNothing #OPcache #FastCGI #برنامهنویسی #توسعهوب #معمارینرمافزار
منبع: