PHP-FPM مخفف PHP FastCGI Process Manager است. این ابزار فرایندهای اجرای PHP را برای درخواست‌های وب مدیریت می‌کند. در معماری متداول Nginx و PHP، وب‌سرور فایل‌های استاتیک را ارائه می‌دهد و اجرای فایل‌های PHP را از طریق FastCGI به کارگرهای PHP-FPM می‌سپارد. پس PHP-FPM نه فریم‌ورک است، نه وب‌سرور و نه جایگزین کامپوزر.

مسیر اجرای درخواست از مرورگر تا PHP

  • مرورگر درخواست HTTP را به Nginx یا Apache می‌فرستد.
  • وب‌سرور مشخص می‌کند درخواست به فایل استاتیک پاسخ داده شود یا به PHP نیاز دارد.
  • درخواست PHP با پروتکل FastCGI از طریق Unix Socket یا پورت داخلی به PHP-FPM می‌رسد.
  • یکی از Workerها اسکریپت PHP را اجرا و پاسخ را به وب‌سرور برمی‌گرداند.
  • وب‌سرور پاسخ HTTP را برای مرورگر ارسال می‌کند.

تفاوت با PHP CLI

PHP CLI برای اجرای اسکریپت در ترمینال استفاده می‌شود. در PHP-FPM، اجرای PHP از مسیر پردازش‌های تحت مدیریت FPM و درخواست FastCGI صورت می‌گیرد. هر دو ممکن است یک نسخه PHP داشته باشند، اما فایل تنظیمات، افزونه‌ها و محدودیت منابعشان می‌تواند متفاوت باشد.

Pool و روش‌های مدیریت Worker

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

حالت <code>pm</code>رفتارمناسب برای
staticتعداد ثابتی Worker همیشه فعال استبار قابل پیش‌بینی و ظرفیت اختصاص‌یافته
dynamicتعداد Worker بر اساس پارامترهای حداقل و حداکثر تغییر می‌کندبسیاری از سایت‌های پرترافیک
ondemandWorker هنگام ورود درخواست ساخته می‌شود و می‌تواند بعد از بی‌کاری متوقف شودسرور دارای چند سایت کم‌ترافیک

نمونه تنظیم Pool

[shop]
user = www-data
group = www-data
listen = /run/php/shop.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log

مقدار pm.max_children سقف درخواست‌های همزمان در حال پردازش داخل Pool را محدود می‌کند. تعیین عدد مناسب باید بر اساس مصرف واقعی حافظه Workerها، ظرفیت RAM، زمان پاسخ و ترافیک انجام شود. زیاد کردن آن بدون اندازه‌گیری ممکن است به کمبود حافظه منجر شود.

نمونه پیکربندی Nginx

server {
    listen 80;
    server_name shop.example.org;
    root /var/www/shop/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/shop.sock;
    }
}

محدودیت نمونه

فایل تنظیمات بالا یک نمونه آموزشی برای لینوکس است. مسیر Socket، کاربر، قوانین دسترسی و مسیر public باید با پروژه واقعی هماهنگ شوند. پس از تغییر Nginx از nginx -t برای بررسی Syntax استفاده کنید. FastCGI نباید از شبکه نامطمئن در دسترس باشد.

نصب و دستورات عیب‌یابی روی اوبونتو

sudo apt update
sudo apt install php-fpm
# Inspect the installed PHP-FPM service name
systemctl list-units --all 'php*-fpm.service'
# Replace 8.4 with the installed version
sudo systemctl status php8.4-fpm
sudo php-fpm8.4 -tt
sudo systemctl reload php8.4-fpm
sudo nginx -t

در بعضی توزیع‌ها نام سرویس و مسیر فایل‌های پیکربندی متفاوت است. در کنترل‌پنل‌هایی مانند cPanel هم مدیریت PHP-FPM ممکن است از طریق رابط مدیریتی صورت بگیرد. برای بررسی مشکلات عملکرد، به مصرف حافظه، صف انتظار اتصال، زمان پاسخ، Slowlog و تعداد Workerهای فعال توجه کنید.

مستندات و مطالعه بیشتر

راهنمای PHP-FPM در مستندات رسمی PHP و پارامترهای رسمی پیکربندی Pool.

اصطلاحات مرتبط: پی‌اچ‌پی، انجینکس، وب هاستینگ، داکر، کشینگ.

برای آشنایی با وظایف کلی نرم‌افزارهای پاسخ‌دهنده به درخواست وب، صفحه وب سرور را هم بخوانید.