চমৎকার! আপনি এখন যাচ্ছেন Laravel এর জন্য সবচেয়ে গুরুত্বপূর্ণ অপ্টিমাইজেশন ধাপে — PHP-FPM এবং Opcache Deep Optimization। এই ধাপে আমরা শুধুমাত্র কীভাবে কনফিগার করবেন তা-ই নয়, বরং প্রতিটি লাইন, কমান্ড ও কনফিগের পিছনে বাস্তব ব্যাখ্যা, উদ্দেশ্য ও প্রফেশনাল context দেখাবো যেন Laravel স্কেল করে 1000+ রিকোয়েস্ট অনায়াসে হ্যান্ডেল করতে পারে।
🧱 OBJECTIVE (লক্ষ্য):
Laravel কে এমনভাবে সার্ভারে অপ্টিমাইজ করা যেন:
- ⏱️ দ্রুত response time দেয়
- 🧠 বেশি concurrent requests হ্যান্ডেল করতে পারে
- 🧰 memory leak / process overload না হয়
- 💥 Laravel queue/session/cache Redis দিয়ে efficiently চলে
🔰 PART 2.A: PHP-FPM Optimization (Deep Practical Guide)
📌 STEP 1: আপনার সার্ভারে মোট RAM ও Core চেক করুন
free -m
lscpu
উদাহরণ output:
total used free shared buff/cache available
Mem: 7862 643 5212 29 2006 6912
CPU(s): 4
Model name: Intel Xeon CPU
👉 এটা জানার মাধ্যমে আপনি বুঝতে পারবেন আপনার সার্ভার কতটা PHP worker চালাতে পারবে।
🧪 STEP 2: PHP-FPM Config ফাইল লোকেট করুন
Laravel এর জন্য PHP-FPM ব্যবহার হয়। PHP-FPM এর Pool config ফাইল সাধারণত এখানে থাকে:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
📂 /etc/php/8.2/fpm/pool.d/ → Pool config directory
📝 www.conf → default pool file যেখানে PHP worker behavior define করা হয়
🔧 STEP 3: Process Manager কনফিগার করুন
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
🔍 ব্যাখ্যা (Engineer-Level):
| Parameter | উদ্দেশ্য |
|---|---|
pm = dynamic | Laravel app এর ট্রাফিক অনুযায়ী worker auto scale করবে |
pm.max_children = 50 | সর্বোচ্চ একসাথে ৫০টি PHP প্রক্রিয়া চলবে — এটাই আপনার RAM অনুযায়ী টিউন করতে হবে |
pm.start_servers = 10 | সার্ভার start এর সময় শুরুতে ১০টি worker চালু থাকবে |
pm.min_spare_servers = 5 | idle অবস্থায় কমপক্ষে ৫টি worker standby থাকবে |
pm.max_spare_servers = 20 | idle অবস্থায় সর্বোচ্চ ২০টি worker standby থাকবে |
pm.max_requests = 500 | এক worker ৫০০টি request সার্ভ করার পর reset হবে (memory leak রোধে) |
🧠 Formula: pm.max_children নির্ণয়
pm.max_children = (Total PHP available RAM) / (Average PHP Memory Per Request)
উদাহরণ:
- Total PHP RAM = 2GB = 2048MB
- Average Memory = 20MB
pm.max_children = 2048 / 20 = 102
🎯 সাধারণভাবে:
| RAM | Suggested pm.max_children |
|---|---|
| 2GB | 40–60 |
| 4GB | 80–100 |
| 8GB | 120–160 |
🧪 STEP 4: PHP-FPM Log ও Status চেক
Worker Status চালু রাখতে চান?
pm.status_path = /status
sudo systemctl restart php8.2-fpm
Nginx Config এ যুক্ত করুন (অপশনাল)
location ~ ^/(status|ping)$ {
access_log off;
allow your.ip.address;
deny all;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
🔁 STEP 5: Restart PHP-FPM
sudo systemctl restart php8.2-fpm
🔥 PART 2.B: Opcache Optimization (Deep Explanation)
🎯 লক্ষ্য:
Laravel 10/11 এর মতো বড় ফ্রেমওয়ার্কে হাজার হাজার PHP ফাইল থাকে। প্রতিবার রিকোয়েস্টে এগুলোর প্রতিটি compile হলে response time অনেক বেড়ে যায়।
Opcache এগুলিকে compile করে RAM-এ রাখে। এতে response 3x–5x দ্রুত হয়।
📁 STEP 1: Opcache Config ফাইল খুলুন
sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
🔧 STEP 2: Laravel জন্য টিউন করুন
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.save_comments=1
opcache.jit=1205
opcache.jit_buffer_size=64M
🔍 ব্যাখ্যা:
| Parameter | ব্যাখ্যা |
|---|---|
memory_consumption=256 | Opcache এর জন্য 256MB allocate (default 128MB) |
interned_strings_buffer=16 | frequently-used strings RAM-এ রাখে |
max_accelerated_files=20000 | Laravel এর জন্য অনেক ফাইল থাকে (>=10k) |
revalidate_freq=60 | প্রতি 60 সেকেন্ড পর ফাইল চেক করে চেঞ্জ হয়েছে কিনা |
validate_timestamps=1 | Laravel dev এ 1, prod এ 0 রাখা ভালো |
save_comments=1 | PHPDoc comments রাখে (যদি package use করে) |
jit | Just-In-Time compile করে আরও দ্রুত response দেয় |
jit_buffer_size=64M | JIT জন্য buffer (>= Laravel 9 support) |
🔁 STEP 3: Restart করুন
sudo systemctl restart php8.2-fpm
🔍 STEP 4: Opcache তথ্য চেক করুন
php -i | grep opcache
📊 PART 2.C: Laravel Config সেটআপ
APP_ENV=production
APP_DEBUG=false
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
OPCACHE_ENABLE=true
✅ PART 2 SUMMARY CHECKLIST
| Component | অপ্টিমাইজ হয়েছে? |
|---|---|
| PHP-FPM Dynamic Worker | ✅ |
| pm.max_children tuned | ✅ |
| Opcache RAM boosted | ✅ |
| Opcache + JIT + accelerated files | ✅ |
| Laravel .env tuned | ✅ |