
در سالهای اخیر، اجرای PHP وارد فاز جدیدی شده و با ظهور application serverهایی مانند FrankenPHP، مسیر اجرای کد PHP بهصورت مستقیم و مستقل از وبسرورهای سنتی ممکن شده است. application serverها برخلاف مدلهای سنتی که PHP فقط نقش مفسر سمت سرور را دارد، یک لایهی ترکیبی بین وبسرور، زبان برنامهنویسی و مدیریت درخواستها فراهم میکنند. در این مدل، خود application server توانایی دریافت درخواست HTTP، اجرای کد PHP و ارسال پاسخ را بدون وابستگی به Apache یا Nginx دارد.
در روش سنتی، وبسرور مسئول دریافت درخواست و forward کردن آن به مفسر PHP است، اما در application server، همهچیز بهشکل یکپارچه اجرا میشود. این یکپارچگی مزایایی مانند راهاندازی سادهتر، latency پایینتر، و قابلیتهای داخلی برای هندل درخواستها، static file serving، و حتی hot reload را فراهم میکند.
از نظر معماری، application serverها معمولاً با الگوی multi-threaded طراحی میشوند، به این معنا که بهجای ایجاد process جداگانه برای هر درخواست (مانند PHP-FPM)، از چندین thread درون یک process مشترک استفاده میشود. این مدل باعث کاهش چشمگیر مصرف منابع و افزایش سرعت پاسخگویی به درخواستهای همزمان میشود، چرا که ایجاد و مدیریت thread بسیار سبکتر از process است و امکان اشتراک حافظه و منابع بین threadها نیز وجود دارد.

سرور Franken PHP نسل جدیدی از سرورهای اجرای PHP است که برای سادهسازی فرایند اجرای برنامههای PHP طراحی شده. برخلاف روشهای سنتی که به نصب و تنظیم جداگانهی PHP، وبسرور (مانند Apache یا Nginx) و PHP-FPM نیاز دارند، FrankenPHP همهی این اجزا را بهصورت یکپارچه در یک فایل باینری واحد ترکیب کرده است. این باینری شامل PHP بهشکل embed شده، وبسرور Caddy و پشتیبانی داخلی از HTTPS است؛ در نتیجه میتوان تنها با اجرای یک فایل، یک محیط کامل برای اجرای PHP در اختیار داشت.
هدف FrankenPHP کاهش پیچیدگی در راهاندازی، افزایش کارایی و تسهیل deployment است، بهخصوص در محیطهایی مثل Docker که سادگی و سبکی اهمیت بالایی دارد. با اجرای مستقیم کد PHP درون process سرور، نیازی به ایجاد یا مدیریت processهای خارجی (مثل PHP-FPM) نیست و زمان پاسخدهی به درخواستها کاهش مییابد. این ابزار همچنین با پشتیبانی از قابلیتهایی مثل Hot Reload و اجرای background taskها، خود را بهعنوان یک گزینهی آیندهدار و جذاب در اکوسیستم PHP معرفی کرده است.
در مدل blocking مانند PHP-FPM، هر درخواست توسط یک process جداگانه پردازش میشود و تا زمانی که اجرای آن تمام نشود، آن process نمیتواند درخواست دیگری را بپذیرد؛ بنابراین اگر تعداد درخواستها بیشتر از تعداد processهای موجود شود، درخواستها در صف انتظار قرار میگیرند. اما در مدل non-blocking مثل FrankenPHP که معمولاً بر پایهی event loop و معماری multi-thread یا async طراحی شده، یک thread یا process میتواند چندین درخواست را بهصورت همزمان (concurrently) مدیریت کند. این باعث میشود منابع بهتر استفاده شوند و تأخیر در پاسخدهی به درخواستها (latency) بهشدت کاهش یابد، مخصوصاً در اپلیکیشنهایی با تعداد بالای اتصال یا عملیات I/O زیاد.
در این مقاله، با نگاهی دقیق به مسیر اجرای کد PHP از طریق روشهای مختلف از جمله CLI، وبسرورها و application serverها، درک بهتری از چرخهی حیات یک اسکریپت PHP پیدا کردیم. در نهایت، انتخاب بهترین روش اجرای PHP بستگی به نوع پروژه، حجم ترافیک، منابع سختافزاری و نیازمندیهای خاص توسعهدهنده دارد. اما دانستن اینکه PHP در پشت صحنه دقیقاً چگونه اجرا میشود، به ما کمک میکند انتخابهای بهتری داشته باشیم، مشکلات را سریعتر دیباگ کنیم و نهایت بهرهوری را از زبان PHP بگیریم.