اگر با تنظیمات سرور کار کرده‌اید، احتمالاً نام PHP-FPM را شنیده‌اید. اما دقیقاً چیست، چطور کار می‌کند، و چرا برای سرعت سایت مهم است؟ در این مقاله به‌طور کامل PHP-FPM را توضیح می‌دهیم—از معماری آن تا تنظیمات بهینه برای سرور شما.

PHP-FPM چیست؟

PHP-FPM مخفف PHP FastCGI Process Manager است. این یک پیاده‌سازی از پروتکل FastCGI برای PHP است که به‌صورت سرویس مستقل اجرا می‌شود و امکان مدیریت بهتر فرآیندهای PHP را فراهم می‌کند.

به زبان ساده: به جای اینکه وب سرور مستقیماً PHP را اجرا کند، یک سرویس جداگانه (PHP-FPM) تعدادی فرآیند PHP را آماده نگه می‌دارد. وقتی درخواستی برای یک فایل PHP می‌آید، وب سرور آن درخواست را به PHP-FPM می‌فرستد، PHP-FPM آن را پردازش می‌کند، و نتیجه را برمی‌گرداند.

تاریخچه: روش‌های اجرای PHP

برای درک بهتر PHP-FPM، باید سیر تکامل روش‌های اجرای PHP را بشناسیم:

CGI (Common Gateway Interface)

قدیمی‌ترین روش. برای هر درخواست PHP یک فرآیند جدید ساخته می‌شود، کد PHP اجرا می‌شود، نتیجه برمی‌گردد، و فرآیند کشته می‌شود. این روش بسیار ناکارآمد است—راه‌اندازی یک فرآیند PHP در هر بار چند صد میلی‌ثانیه طول می‌کشد. برای ترافیک بالا کاملاً غیرقابل استفاده است.

mod_php (Apache Module)

در این روش PHP به‌صورت ماژول درون Apache اجرا می‌شود. هر فرآیند Apache یک instance PHP دارد. مزیت اصلی آن سادگی است—نیازی به سرویس جداگانه نیست. اما معایب جدی دارد: هر فرآیند Apache حتی برای سرو یک تصویر استاتیک، همه حافظه PHP را اشغال می‌کند. در ترافیک بالا، مصرف RAM به‌سرعت بالا می‌رود.

FastCGI و PHP-FPM

پیشرفته‌ترین و کارآمدترین روش. فرآیندهای PHP جدا از وب سرور اجرا می‌شوند و زنده می‌مانند. به جای ایجاد فرآیند جدید در هر درخواست، درخواست به یک فرآیند آماده فرستاده می‌شود. PHP-FPM یک پیاده‌سازی پیشرفته از این مفهوم است با قابلیت‌های مدیریت، مانیتورینگ، و تنظیم دقیق.

معماری PHP-FPM: چطور کار می‌کند؟

PHP-FPM یک pool (مخزن) از فرآیندهای PHP نگه می‌دارد. هر Pool مستقل است و می‌تواند تنظیمات متفاوتی داشته باشد. جریان کار به این صورت است:

  1. درخواست HTTP برای یک فایل .php به وب سرور می‌رسد
  2. وب سرور (Nginx یا Apache) از طریق socket یا پورت TCP درخواست را به PHP-FPM می‌فرستد
  3. PHP-FPM Master Process یک worker فعال انتخاب می‌کند
  4. Worker فایل PHP را اجرا می‌کند، کوئری‌های دیتابیس انجام می‌شوند، نتیجه تولید می‌شود
  5. نتیجه HTML به وب سرور برمی‌گردد
  6. Worker آماده می‌شود تا درخواست بعدی را بپذیرد

نکته کلیدی این است که فرآیندهای PHP زنده می‌مانند—نه کشته می‌شوند و نه از صفر ساخته می‌شوند. این تفاوت اصلی با CGI است که منجر به عملکرد بسیار بهتر می‌شود.

مزایای PHP-FPM

۱. مصرف حافظه بهتر

چون فرآیندهای PHP کاملاً از وب سرور جدا هستند، وب سرور می‌تواند فایل‌های استاتیک را بدون هیچ سربار PHP مدیریت کند. فقط فرآیندهایی که واقعاً PHP اجرا می‌کنند حافظه PHP را مصرف می‌کنند. در مقایسه با mod_php، معمولاً ۳۰–۵۰٪ کاهش مصرف RAM در بار مشابه.

۲. مدیریت دقیق منابع

PHP-FPM به شما امکان می‌دهد دقیقاً مشخص کنید چند فرآیند PHP فعال باشند، چه زمانی ساخته شوند، و چه زمانی کشته شوند. این کنترل دقیق از مصرف بیش از حد منابع جلوگیری می‌کند.

۳. سازگاری با Nginx

Nginx به‌صورت بومی نمی‌تواند PHP اجرا کند—برخلاف Apache که mod_php دارد. PHP-FPM بهترین و رایج‌ترین راه استفاده از PHP با Nginx است و ترکیب Nginx + PHP-FPM به معماری استاندارد سرورهای مدرن تبدیل شده.

۴. Multi-Pool و جداسازی کاربران

می‌توانید برای هر سایت یا کاربر یک Pool جداگانه تعریف کنید. هر Pool می‌تواند با کاربر سیستمی متفاوت، تنظیمات PHP متفاوت، و محدودیت‌های منابع متفاوت اجرا شود. این قابلیت برای هاست‌های اشتراکی یا محیط‌هایی که چند سایت روی یک سرور دارند بسیار ارزشمند است.

۵. Emergency Restart

PHP-FPM قابلیت Graceful Restart دارد—می‌توانید تنظیمات را reload کنید بدون اینکه اتصالات فعال قطع شوند. همچنین اگر یک worker فرآیند PHP خراب شود، PHP-FPM آن را restart می‌کند.

۶. Slow Log

PHP-FPM می‌تواند درخواست‌هایی که بیش از حد زمان می‌برند را در یک فایل log جداگانه ثبت کند. این ابزار بسیار ارزشمندی برای شناسایی بطل‌النفس‌های عملکردی (Performance Bottleneck) است.

تنظیمات کلیدی PHP-FPM

فایل‌های تنظیمات PHP-FPM معمولاً در این مسیرها قرار دارند:

  • Debian/Ubuntu: /etc/php/X.X/fpm/pool.d/www.conf
  • CentOS/RHEL: /etc/php-fpm.d/www.conf

pm (Process Manager Mode)

یکی از مهم‌ترین تنظیمات، نوع مدیریت فرآیند است:

  • static: تعداد ثابت و از پیش تعیین‌شده‌ای از worker ها همیشه فعال هستند. مناسب برای سرورهایی با ترافیک پایدار. مصرف RAM قابل پیش‌بینی است.
  • dynamic: تعداد worker ها بر اساس بار تغییر می‌کند—بین pm.min_spare_servers و pm.max_children. متداول‌ترین حالت برای اکثر سرورها.
  • ondemand: Worker فقط وقتی درخواست می‌آید ساخته می‌شود و بعد از مدتی بیکاری (pm.process_idle_timeout) کشته می‌شود. مناسب برای سرورهای کم‌ترافیک که کمترین مصرف RAM اهمیت دارد.

pm.max_children

حداکثر تعداد worker های همزمان. این مهم‌ترین تنظیم است. اگر تعداد درخواست‌های همزمان از این عدد بیشتر شود، درخواست‌های اضافی صف می‌شوند یا رد می‌شوند. محاسبه صحیح:

pm.max_children = (RAM قابل استفاده برای PHP) ÷ (حافظه مصرفی هر worker)

برای محاسبه حافظه هر worker می‌توانید دستور زیر را اجرا کنید:
ps aux | grep php-fpm | awk '{print $6}' | sort -n

معمولاً هر worker بین ۳۰ تا ۱۰۰ مگابایت مصرف می‌کند—بستگی به پیچیدگی کد PHP و تعداد افزونه‌های بارگذاری‌شده دارد.

pm.start_servers، pm.min_spare_servers، pm.max_spare_servers

  • pm.start_servers: تعداد worker هایی که در شروع سرویس ساخته می‌شوند
  • pm.min_spare_servers: حداقل تعداد worker های بیکار (آماده قبول درخواست)
  • pm.max_spare_servers: حداکثر تعداد worker های بیکار—worker های اضافه کشته می‌شوند

request_terminate_timeout

حداکثر زمان اجرای یک درخواست PHP. اگر یک اسکریپت بیش از این زمان طول بکشد، worker کشته و restart می‌شود. این از مسدود شدن سرور توسط اسکریپت‌های معیوب جلوگیری می‌کند.

slowlog و request_slowlog_timeout

اگر request_slowlog_timeout را تنظیم کنید، PHP-FPM درخواست‌هایی که از این زمان بیشتر طول می‌کشند را در فایل slowlog ثبت می‌کند. این ابزار ارزشمندی برای یافتن کوئری‌های کند یا کد ناکارآمد است.

تنظیمات پیشنهادی بر اساس RAM سرور

این تنظیمات را به‌عنوان نقطه شروع استفاده کنید و بر اساس مانیتورینگ واقعی تنظیم کنید:

VPS با ۱ گیگابایت RAM

pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5

VPS با ۲ گیگابایت RAM

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

سرور با ۴ گیگابایت RAM (وردپرس با ترافیک متوسط)

pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 20

PHP-FPM با Nginx: پیکربندی نمونه

در Nginx، یک block location برای پردازش فایل‌های PHP به PHP-FPM نیاز دارید:

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

PHP-FPM می‌تواند از طریق Unix Socket (سریع‌تر، توصیه‌شده) یا TCP Port (مناسب برای سرور جداگانه) با Nginx ارتباط برقرار کند.

چطور بفهمم PHP-FPM فعال است؟

چند روش برای بررسی:

  • یک فایل PHP با تابع phpinfo() بسازید و در خروجی به دنبال "Server API" بگردید—اگر "FPM/FastCGI" نوشته باشد، PHP-FPM فعال است
  • دستور systemctl status php8.1-fpm (شماره نسخه را تنظیم کنید) وضعیت سرویس را نشان می‌دهد
  • دستور ps aux | grep php-fpm فرآیندهای فعال PHP-FPM را نشان می‌دهد

مشکلات رایج و راه‌حل‌ها

خطای "connect() to unix:/run/php/php-fpm.sock failed"

این خطا معمولاً به دلایل زیر رخ می‌دهد: سرویس PHP-FPM متوقف شده (با systemctl start php-fpm راه‌اندازی کنید)، مشکل در مسیر socket (مسیر را در تنظیمات Nginx و PHP-FPM یکسان کنید)، یا مشکل permissions (کاربر Nginx باید به socket دسترسی داشته باشد).

درخواست‌ها صف می‌شوند یا timeout می‌شوند

اگر در لاگ‌ها پیام‌هایی مثل "max_children reached" می‌بینید، تعداد pm.max_children را افزایش دهید—البته مطمئن شوید که RAM کافی دارید. اگر RAM کافی ندارید، باید کدهای PHP را بهینه کنید یا منابع سرور را ارتقا دهید.

سوالات متداول

آیا PHP-FPM برای همه سرورها مناسب است؟

PHP-FPM برای VPS و سرورهای اختصاصی که شما کنترل کامل دارید مناسب است. در هاست اشتراکی معمولاً ارائه‌دهنده هاست این تنظیمات را مدیریت می‌کند و شما دسترسی مستقیم ندارید—اما می‌توانید از پنل مدیریتی (مثل cPanel) نسخه PHP را انتخاب کنید.

PHP-FPM در مقابل mod_php: کدام انتخاب بهتری است؟

برای سرورهای مدرن، PHP-FPM انتخاب بهتری است. مصرف حافظه کمتر، انعطاف بیشتر، سازگاری با Nginx، و قابلیت‌هایی مثل Slow Log. تنها دلیل استفاده از mod_php امروزه ممکن است ساده‌تر بودن تنظیمات اولیه در Apache باشد.

آیا می‌توانم چند نسخه PHP را همزمان اجرا کنم؟

بله، یکی از بزرگ‌ترین مزایای PHP-FPM این است که می‌توانید چند سرویس PHP-FPM با نسخه‌های مختلف (مثلاً PHP 8.0 و PHP 8.2) همزمان اجرا کنید و هر سایت را به نسخه متفاوتی وصل کنید. این برای مدیریت سایت‌هایی که نیاز به نسخه‌های مختلف PHP دارند بسیار مفید است.

آیا OPcache با PHP-FPM کار می‌کند؟

بله، OPcache به‌خوبی با PHP-FPM کار می‌کند و ترکیب آن‌ها یکی از بهترین روش‌های بهینه‌سازی PHP است. OPcache کد PHP را بعد از اجرای اول در حافظه نگه می‌دارد تا بار دیگر نیازی به parse و compile مجدد نباشد. این ترکیب می‌تواند مصرف CPU را به‌طور چشمگیری کاهش دهد.

جمع‌بندی

PHP-FPM بهترین روش اجرای PHP روی سرورهای مدرن است. با جداسازی فرآیندهای PHP از وب سرور، مصرف حافظه را کاهش می‌دهد، عملکرد را بهبود می‌بخشد، و انعطاف‌پذیری بیشتری در مدیریت منابع می‌دهد. اگر روی صباهاست یا هر ارائه‌دهنده دیگری VPS دارید، PHP-FPM را فعال کنید، تنظیمات pm را بر اساس RAM سرور تنظیم کنید، و با OPcache ترکیب کنید تا بهترین نتیجه را بگیرید.