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 بر اساس پارامترهای حداقل و حداکثر تغییر میکند | بسیاری از سایتهای پرترافیک |
ondemand | Worker هنگام ورود درخواست ساخته میشود و میتواند بعد از بیکاری متوقف شود | سرور دارای چند سایت کمترافیک |
نمونه تنظیم 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.
اصطلاحات مرتبط: پیاچپی، انجینکس، وب هاستینگ، داکر، کشینگ.
برای آشنایی با وظایف کلی نرمافزارهای پاسخدهنده به درخواست وب، صفحه وب سرور را هم بخوانید.