وظیفه اصلی وب سرور ارائه پاسخ درست در زمان مناسب به کلاینت های مختلف است. کلاینت ها معمولا صبر کافی برای پیدا کردن پاسخ درخواست را ندارند و می خواهند که هرچه زودتر به جواب برسند. به همین دلیل طراحی سروری که بتواند در میان هزاران فایل موجود بهترین پاسخ را تولید کرده و برای درخواست کننده ارسال کند، بسیار مهم است.

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

منظور از PHP-FPM چیست؟

زمانی که مرورگر درخواستی را به سروری که با PHP برنامه نویسی شده است ارسال می کند، ابتدا سرور HTTP است که آن را می شنود و تصمیم می گیرد که چگونه با آن برخورد کند. مهم ترین انواع سرورهای HTTP، آپاچی و Nginx هستند که باید تصمیم بگیرند چگونه به PHP وصل شوند و درخواست ها و داده ها را به آن انتقال دهند.
زمانی که سرور اصلی از نوع آپاچی باشد، PHP ماژولی است که در داخل سرور گنجانده شده؛ بنابراین هر زمان که درخواستی دریافت شود، سرور یک فرآیند جدید را شروع می کند که به طور خودکار شامل PHP می شود و آن را اجرا می کند. به این روش mod-php گفته می شود که مخفف عبارت PHP as a module است. اینکه PHP از ساختار وب سرور جدا نیست و به عنوان عضوی از آن فعالیت می کند، باعث ایجاد محدودیت هایی می شود. Nginx با استفاده از PHP-FPM بر آن ها غلبه کرده و راهکاری به وجود آورده که در کوتاه ترین زمان ممکن بهترین جواب برای هر کلاینت تولید شود.
در PHP-FPM، این خود سرور نیست که مسئولیت پیگیری فایل های PHP را بر عهده می گیرد؛ بلکه این کار به فرآیندهای وابسته به برنامه PHP که درون سرور وجود دارند، واگذار شده است. در واقع وب سرور به این که PHP کجاست و نحوه بارگذاری آن چگونه است، اهمیتی نمی دهد. بلکه آن چیزی که برای او اهمیت دارد این است که داده ها را چگونه از PHP دریافت یا برای آن ارسال کند تا در بهترین زمان به دست کلاینت برسند.
زمانی که برای اولین بار تنظیمات Nginx را باز می کنید، با چیزی شبیه به آن چه که در زیر آمده است، روبه رو خواهید شد:

در این برنامه، خط php7.2-fpm.sock به Nginx می گوید که با استفاده از این سوکت به دنبال برقراری ارتباط با فرآیند PHP باشد؛ بنابراین Nginx داده های مورد نیاز هر درخواستی را که دریافت می کند، از طریق این فایل می نویسد و بعد از دریافت خروجی، آن را به مرورگر ارسال می کند.
به طور کلی باید گفت که در این تنظیمات PHP-FPM ، پی اچ پی مستقیماً درخواست های ارسال شده توسط مرورگرها را دریافت نمی کند. ابتدا وب سرورها مانند Nginx آن ها را رهگیری می کنند و در صورتی که لازم بود آن را می فرستند. وب سرورها می دانند که از چه طریقی باید به فرآیند PHP وصل شوند و کلیه داده های درخواست را به PHP ارسال کنند. زمانی که PHP کار خود را به پایان می رساند، پاسخ را به وب سرور می فرستد و آن را برای مرورگر ارسال می کند.
در این جا، FPM ( Fast Process Manager ) که در کنار PHP قرار گرفته مسئولیت کنترل فرآیندهای PHP را به عهده می گیرد. FPM مدیر فرآیندی است که وب سرور درخواست ها را به آن ارسال می کند و پاسخ را نیز از همین طریق دریافت خواهد کرد. همین موضوع باعث می شود که سرور اصلی درگیری مستقیمی با پی اچ پی نداشته باشد و بتواند پاسخ را در زمانی سریع تر برای کلاینت ارسال کند.

چرا باید تنظیمات PHP-FPM را بهینه‌سازی کنیم ؟

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

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

چگونه تنظیمات PHP-FPM را بهینه‌سازی کنیم ؟

بسته به نوع سرور، مسیر فایل پیکربندی شده PHP-FPM متفاوت است؛ به همین دلیل ابتدا باید آن را پیدا کنید. در نسخه PHP 7.2 اوبونتو، مسیر فایل به شکل زیر است:

/etc/php/7.2/fpm/php-fpm.conf

با باز کردن این فایل کدهای زیر را مشاهده می کنید :

در خط pid = /run/php/php7.2-fpm.pid گفته می شود که کدام فایل شناسه فرآیند PHP-FPM را شامل می شود. مسیر var/log/php7.2-fpm.log، جایی است که لاگ های PHP-FPM ذخیره می شود.

به منظور بهینه کردن تنظیمات پی اچ پی- اف پی ام، در این فایل، به شکل زیر، سه متغیر دیگر را اضافه کنید :

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

در خط سوم به پردازش های فرزند گفته می شود که باید چه مدت زمانی برای اجرای سیگنال دریافتی توسط فرآیند والد منتظر بمانند. برای مثال اگر فرآیند والد یک سیگنال KILL بفرستد و فرآیندهای فرزند در مسیر آن قرار بگیرند، ممکن است درخواست های آن ها دیده نشود. اگر فرزندان این زمان استاندارد را صبر کنند دیگر در مسیر سیگنال های اشتباه قرار نمی گیرند و پاسخ دقیقا مطابق با درخواست آن ها ارسال می شود.

شایان ذکر است که این بخش مربوط به تنظیمات PHP-FPM نیست و تنها قدمی برای شروع آن است، زیرا این تکنیک مجموعه جدیدی از فرآیندها را برای ارائه درخواست های وب درست می کند که پیکربندی جداگانه ای دارند. در ادامه نحوه ویرایش فایل /etc/php/7.2/fpm/pool.d/www.conf در مجموعه www آورده شده است :

اگر شما هنگام راه اندازی وب سایت خود با مشکلات مجوز فایل مواجه شده اید، احتمالاً مالک یا گروه دایرکتوری به www-data تغییر داده شده است. در این صورت فرآیند PHP می تواند در فایل ها گزارش بنویسد و اسناد را آپلود کند.

در گام بعدی به سراغ مدیریت فرآیند می رویم که پیش فرض های آن به صورت زیر است :

بر اساس آنچه در ادامه آمده است، pm می‌تواند مقدارهای زیر را بگیرد:

بنابراین سه مقدار ممکن وجود دارد :

  • Static : تعداد ثابتی از فرآیندهای PHP که بدون توجه به هر چیزی حفظ خواهند شد.
  • Dynamic : حداقل و حداکثر تعداد پردازش‌هایی را که PHP-FPM در هر نقطه از زمان زنده نگه می‌دارد را مشخص می‌کند.
  • Ondemand : بر اساس تقاضا، فرآیندها ایجاد می‌شوند و از بین می‌روند.

اگر شما دارای وب‌سایتی با ترافیک کم هستید، تنظیمات دینامیک در بیشتر مواقع اتلاف منابع هستند. اگر فرض کنیم که شما Pm.min_spare_servers را روی 3 تنظیم کرده‌اید، سه فرآیند PHP ایجاد می‌شود و حتی زمانی که ترافیکی در وب‌سایت وجود ندارد، حفظ می‌شود. در این مورد، گزینه بهتر Ondemand است که اجازه تصمیم‌گیری به سیستم را می‌دهد تا زمان راه‌اندازی فرآیندهای جدید را تعیین کند. برای وب‌سایت‌هایی که ترافیک زیادی دارند، Dynamic برای آن‌ها گزینه مناسب است.

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

سخن پایانی

در این مقاله نمونه‌ای از تنظیمات PHP-FPM گفته شد و شایان‌ذکر است که حتی اگر شما تمام اصول مربوط به تنظیمات در این زمینه را بدانید، تضمینی برای موفقیت وجود ندارد. شما با توجه به نیازهای خود باید برای بهینه‌سازی تنظیمات پی اچ پی – اف پی ام اقدام کنید و درصورتی‌که وقت کافی برای بهینه‌سازی ندارید می‌توانید از پلتفرمی مطمئن مانند Kinsta بهره بگیرید که باعث مراقبت از امنیت بهینه‌سازی می‌شود.