অ্যাডভান্সড পিএইচপি ইন্টারনালস (The Engine Room)
অভিনন্দন! আপনি এখন পিএইচপির "ব্ল্যাক বক্স" খুলতে যাচ্ছেন। কোড লেখার পর Enter চাপলে ভেতরে আসলে কী ঘটে? কেন সার্ভার স্লো হয়? কেন মেমোরি লিক হয়?
এই অধ্যায়ে আমরা পিএইচপির ইঞ্জিন রুমে ঢুকে সব যন্ত্রপাতি খুলে দেখব।
৭.১ OPcache — পারফরম্যান্স বুস্টার (Zend Engine Level)
পিএইচপি একটি ইন্টারপ্রেটেড ল্যাঙ্গুয়েজ। এর মানে, প্রতিবার যখন কেউ আপনার সাইটে আসে, পিএইচপিকে পুরো কোড পড়ে রান করতে হয়। কিন্তু এটা কি সময়ের অপচয় নয়? এখানেই আসে OPcache।
⚠️ OPcache ছাড়া রিকোয়েস্ট লাইফসাইকেল:
- Lexing: কোড টোকেনে ভাগ হয়
- Parsing: AST (Abstract Syntax Tree) তৈরি হয়
- Compilation: হিউম্যান রিডেবল কোড → Opcodes
- Execution: কোড রান হয়
✅ OPcache সহ লাইফসাইকেল:
প্রথমবার কম্পাইল হওয়ার পর, Opcodes গুলো সার্ভারের Shared Memory (RAM)-তে সেভ হয়ে যায়।
Next Request: কম্পাইলেশন বাদ! সরাসরি মেমোরি থেকে Opcodes নিয়ে এক্সিকিউট করে।
⚙️ প্রোডাকশন টিউনিং (Production Settings)
opcache.enable=1
opcache.memory_consumption=256 ; মেমোরি বাড়িয়ে দিন (MB)
opcache.max_accelerated_files=20000 ; কতগুলো ফাইল ক্যাশ করবে
opcache.validate_timestamps=0 ; মোস্ট ইমপরট্যান্ট!
💡 validate_timestamps=0 কেন?
এটি 1 থাকলে পিএইচপি প্রতি রিকোয়েস্টে ফাইল সিস্টেম চেক করে কোড চেঞ্জ হয়েছে কি না। 0 করে দিলে এই চেক বন্ধ হয়ে যায়, ফলে IO অপারেশন কমে সাইট সুপার ফাস্ট হয়। (কিন্তু তখন কোড আপডেট করলে সার্ভার রিস্টার্ট দিতে হয়)।
৭.২ কম্পোজার আর্কিটেকচার — শুধু ডাউনলোড ম্যানেজার নয়
Composer কে শুধু লাইব্রেরি ডাউনলোডার ভাবলে ভুল হবে। এটি পিএইচপির মডার্ন ইকোসিস্টেমের মেরুদণ্ড।
📦 কম্পোজার কীভাবে কাজ করে?
composer.jsonপড়ে ভার্সন কনফ্লিক্ট সলভ করে (SAT Solver Algorithm)- প্যাকেজগুলো
vendorফোল্ডারে নামায় - সবচেয়ে গুরুত্বপূর্ণ: সে একটি Autoload Map জেনারেট করে
🔄 Autoloading Flow:
index.php
└── require 'vendor/autoload.php'
└── composer/autoload_real.php
└── ClassLoader.php (দ্য মাস্টারমাইন্ড)
যখন আপনি new User() কল করেন, কম্পোজার তার ম্যাপ দেখে ফাইলটি include করে দেয়। আপনাকে ম্যানুয়ালি require করতে হয় না।
৭.৩ PSR-4 অটোলোডিং (Deep Dive)
PSR-4 হলো নেমস্পেস থেকে ফাইল পাথে যাওয়ার একটি স্ট্যান্ডার্ড ম্যাপ।
📝 কনফিগারেশন:
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
🔧 ইন্টারনাল লজিক:
যখন আপনি App\Controllers\UserController ক্লাসটি ডাকেন:
- কম্পোজার দেখে
App\প্রিফিক্স মানেsrc/ফোল্ডার - বাকি অংশ
Controllers\UserController - ফাইনাল পাথ:
src/Controllers/UserController.php - ফাইলটি চেক করে (
file_exists) এবং লোড করে
আমরা কমান্ড লাইনে php script.php চালাই, কিন্তু ওয়েব সার্ভারে (Nginx/Apache) পিএইচপি চলে PHP-FPM (FastCGI Process Manager) দিয়ে।
🏗️ আর্কিটেকচার:
- Web Server (Nginx): ট্রাফিক পুলিশ। সে রিকোয়েস্ট রিসিভ করে FPM-এর কাছে পাঠায়
- Master Process: ম্যানেজার। সে কনফিগারেশন লোড করে এবং ওয়ার্কার প্রসেস তৈরি করে
- Worker Processes: শ্রমিক। আসল কোড এক্সিকিউট করে
⚠️ ওয়ার্কার টিউনিং (System Crash বাঁচানো):
সার্ভারে কতগুলো ওয়ার্কার চলবে তা ঠিক করা জরুরি।
pm = dynamic ; ট্রাফিক অনুযায়ী বাড়ে কমে
pm.max_children = 40 ; সর্বোচ্চ কতগুলো প্রসেস চলবে
Calculation: যদি প্রতিটি প্রসেস ৫০ মেগাবাইট র্যাম খায় এবং সার্ভারে ২ জিবি ফ্রি র্যাম থাকে, তবে max_children = 2000 / 50 = 40। এর বেশি দিলে সার্ভার ক্র্যাশ করবে।
৭.৫ MVC ইন্টারনাল — ফ্রেমওয়ার্ক কীভাবে চলে?
যেকোনো পিএইচপি ফ্রেমওয়ার্ক (Laravel, Symfony) আসলে নিচের ফ্লো ফলো করে:
- Entry Point: সব রিকোয়েস্ট
index.phpতে আসে - Bootstrapping: কম্পোজার অটোলোড এবং এনভায়রনমেন্ট লোড হয়
- Routing: URL
(/user/profile)দেখে রাউটার ঠিক করে কোন কন্ট্রোলার লাগবে - Dispatching: Reflection API বা
new Controller()দিয়ে কন্ট্রোলার কল হয় - Execution: কন্ট্রোলার → সার্ভিস → মডেল → ডাটাবেস
- Response: ভিউ রেন্ডার করে ব্রাউজারে পাঠানো হয়
৭.৬ মেমোরি লিক এবং গার্বেজ কালেকশন (GC)
পিএইচপি সাধারণত রিকোয়েস্ট শেষে সব মেমোরি ক্লিয়ার করে দেয়। কিন্তু লং-রানিং স্ক্রিপ্ট (যেমন: Queue Worker, WebSocket) এ মেমোরি লিক ভয়াবহ হতে পারে।
🔄 ১. সার্কুলার রেফারেন্স (The Silent Killer)
$a = [];
$b = [];
$a['friend'] = &$b; // A holds B
$b['friend'] = &$a; // B holds A
unset($a, $b);
// মেমোরি রিলিজ হয় না! কারণ তারা একে অপরকে ধরে আছে
🧹 ২. GC কীভাবে কাজ করে?
যখন মেমোরি বাফার পূর্ণ হয় (ডিফল্ট ১০,০০০ ভেরিয়েবল), তখন জেন্ড ইঞ্জিনের GC জেগে ওঠে। সে মেমোরি স্ক্যান করে এমন ডেটা খুঁজে বের করে যা কেউ ব্যবহার করছে না কিন্তু মেমোরি ধরে আছে—এবং সেগুলো ডিলিট করে।
৭.৭ সুপারগ্লোবালস এবং এনভায়রনমেন্ট ভেরিয়েবল
$_GET, $_POST কোথা থেকে আসে?
এগুলো পিএইচপি নিজে বানায় না। ওয়েব সার্ভার (Nginx) যখন রিকোয়েস্ট পাঠায় (SAPI Interface দিয়ে), তখন সে হেডার এবং বডি পার্স করে এই অ্যারেগুলো পপুলেট করে স্ক্রিপ্ট রান করার আগেই।
🔧 Environment Variables (.env vs Server)
- Framework (.env): ফ্রেমওয়ার্ক ফাইল পড়ে
putenvকরে। এটি স্লো - Server Environment: লিনাক্স বা Nginx কনফিগ থেকে সরাসরি ভেরিয়েবল সেট করা। এটি সুপার ফাস্ট
💡 Senior Tip: প্রোডাকশনে .env ফাইল রিড না করে সার্ভার এনভায়রনমেন্ট ভেরিয়েবল বা ক্যাশড কনফিগ ব্যবহার করুন।
৭.৮ স্ট্রিমস এবং ফিল্টার (Advanced IO)
পিএইচপিতে সবকিছুই স্ট্রিম (File, Network, Input/Output)।
💰 পাওয়ারফুল ব্যবহার (Custom Filter):
বড় ফাইল প্রসেস করার সময় পুরোটা মেমোরিতে না নিয়ে স্ট্রিম ফিল্টার দিয়ে অন-দ্য-ফ্লাই মডিফাই করা যায়।
// C-Level Optimization using PHP Logic
stream_filter_register("upper", "UpperFilter");
$fp = fopen("data.txt", "r");
stream_filter_append($fp, "upper"); // পড়ার সময়ই সব আপারকেস হয়ে যাবে
৭.৯ রিফ্লেকশন এপিআই (Reflection API)
রিফ্লেকশন হলো কোডের এক্স-রে মেশিন। এটি দিয়ে রানটাইমে ক্লাস, মেথড এবং প্রপার্টি ইনস্পেক্ট করা যায়।
ব্যবহার: লারাভেলের Dependency Injection কন্টেইনার রিফ্লেকশন ব্যবহার করে চেক করে কনস্ট্রাক্টরে কী টাইপ হিন্ট দেওয়া আছে এবং সেই অনুযায়ী ক্লাস ইনজেক্ট করে।
⚠️ ক্ষমতা: এটি দিয়ে private মেথড বা প্রপার্টিও এক্সেস এবং মডিফাই করা যায় (যদিও এটি হ্যাকি)।
৭.১০ ম্যাজিক মেথডস (Hooks)
ম্যাজিক মেথডগুলো লাইফসেভার, কিন্তু সাবধানে ব্যবহার করতে হয়।
| Method | Trigger |
|---|---|
__get / __set | যখন এমন প্রপার্টি এক্সেস করা হয় যা নেই বা প্রাইভেট |
__call | যখন অস্তিত্বহীন মেথড কল করা হয় |
__invoke | যখন অবজেক্টকে ফাংশনের মতো কল করা হয় ($obj()) |
__debugInfo | var_dump() করলে কী দেখাবে তা কাস্টমাইজ করা যায় |
🎯 Senior Developer Interview Questions (Chapter 7)
Q: opcache.validate_timestamps=0 প্রোডাকশনে কেন রাখা হয়? এর অসুবিধা কী?
এটি ফাইলসিস্টেম চেক বন্ধ করে IO অপারেশন কমায়, ফলে পারফরম্যান্স বাড়ে। অসুবিধা হলো, কোড আপডেট করলে ম্যানুয়ালি php-fpm রিলাওড বা রিস্টার্ট না দিলে নতুন কোড কাজ করে না।
Q: পিএইচপিতে মেমোরি লিক কেন হয়? গার্বেজ কালেক্টর (GC) কখন ট্রিগার হয়?
মূলত সার্কুলার রেফারেন্সের কারণে মেমোরি লিক হয়। যখন মেমোরি রুট বাফার পূর্ণ হয় (সাধারণত ১০,০০০ zval), তখন GC ট্রিগার হয় এবং সাইকেল ক্লিন করে।
Q: PHP-FPM এ pm.max_children ক্যালকুলেট করার সঠিক নিয়ম কী?
max_children = Total Available RAM for PHP / Average RAM per Process। ভুল ক্যালকুলেশন সার্ভার ক্র্যাশ বা স্লো রেসপন্স ঘটাতে পারে।
Q: Composer এর autoload_real.php এর কাজ কী?
এটি কম্পোজারের অটোলুডার ইনিশিয়ালাইজ করে এবং ClassLoader ক্লাসের মাধ্যমে নেমস্পেস ও ফাইল পাথের ম্যাপ লোড করে যাতে অটোমেটিক ক্লাস ইনকুড হয়।
🎯 অধ্যায় ৭ এর সারাংশ (Summary)
এই অধ্যায়ে আমরা শিখলাম:
- ✓OPcache: Opcodes Shared Memory-তে ক্যাশ করে, validate_timestamps=0 পারফরম্যান্স বুস্ট করে
- ✓Composer: PSR-4 autoloading, ClassLoader ম্যাপ জেনারেট করে
- ✓PHP-FPM: Master Worker Architecture, max_children ক্যালকুলেশন kritikal
- ✓Garbage Collection: Circular Reference সনাক্ত করে, 10,000 zval হলে ট্রিগার হয়
- ✓Reflection API: Runtime-এ ক্লাস ইনস্পেক্ট করার এক্স-রে মেশিন
- ✓Magic Methods: __get, __call, __invoke - hooks for dynamic behavior
✨ এটি ছিল পিএইচপির হার্ডকোর ইন্টারনালস। এই নলেজ আপনাকে সাধারণ ডেভেলপার থেকে সিস্টেম আর্কিটেক্টের দিকে নিয়ে যাবে।
পরবর্তী অধ্যায়: Part 8 — Error Handling & Exceptions — যেখানে try-catch, Custom Exceptions এবং Logging নিয়ে আলোচনা হবে।
প্রস্তুত তো? 🚀