একজন Sync PHP ডেভেলপার হিসেবে Async PHP সম্পর্কে আমি যা শিখলাম
আমি বছরের পর বছর Laravel নিয়ে কাজ করেছি। আমি sync PHP ব্যবহার করতাম। একটি রিকোয়েস্ট আসে, একটি প্রসেস চলে এবং একটি রেসপন্স চলে যায়। আমার কখনোই async-এর প্রয়োজন হয়নি।
তারপর আমি নতুন PHP 8.6 Polling API সম্পর্কে পড়লাম। এটি PHP কীভাবে টাস্ক হ্যান্ডেল করে সে সম্পর্কে আমার দৃষ্টিভঙ্গি বদলে দিয়েছে।
Async কীভাবে কাজ করে তার একটি বিস্তারিত বিশ্লেষণ নিচে দেওয়া হলো।
Blocking I/O-এর সমস্যা
যখন আপনি একটি API কল করেন, আপনার কোড অপেক্ষা করে।
উদাহরণ: $response = Http::get('https://api.example.com');
যদি ওই API-টি ৩০০ms সময় নেয়, তবে আপনার PHP প্রসেসটি ৩০০ms পর্যন্ত কিছুই করতে পারে না। এটি একটি স্লিপ (sleep) স্টেটে থাকে। এটি মেমরি দখল করে রাখে এবং একটি ওয়ার্কার স্লট (worker slot) দখল করে নেয়। যদি আপনার সব ওয়ার্কার স্লিপ মোডে থাকে, তবে আপনার সার্ভার নতুন রিকোয়েস্ট গ্রহণ করা বন্ধ করে দেবে।
Async সমাধান
Async আপনাকে ওই ৩০০ms-এর মধ্যে অন্যান্য কাজ করার সুযোগ দেয়। অপেক্ষা করার পরিবর্তে, আপনি অন্যান্য টাস্ক চালাতে পারেন।
কিন্তু ডেটা কখন আসবে তা আপনি কীভাবে জানবেন? এখানেই কার্নেল (kernel)-এর ভূমিকা শুরু হয়।
Polling-এর বিবর্তন
select() PHP 4 থেকে
stream_select()রয়েছে। এটি কার্নেলকে জিজ্ঞাসা করে: "এই সকেটগুলোতে কি কোনো ডেটা প্রস্তুত আছে?" সমস্যাটি হলো rescan tax। যদি আপনার ১০,০০০ কানেকশন থাকে, তবে আপনাকে প্রতিবার পুরো লিস্টটি কার্নেলে পাঠাতে হবে। এটি ধীরগতির এবং এর একটি সীমাবদ্ধতা রয়েছে।epoll / kqueue এটি একটি কার্নেল ফিচার, কোনো ল্যাঙ্গুয়েজ ফিচার নয়। Linux ব্যবহার করে epoll এবং macOS ব্যবহার করে kqueue। পুরো লিস্ট স্ক্যান করার পরিবর্তে, কার্নেল একটি ready-list বজায় রাখে। এটি আপনাকে শুধুমাত্র জানায় কোন নির্দিষ্ট সকেটগুলোতে ডেটা আছে। এটি কোনো অতিরিক্ত খরচ ছাড়াই হাজার হাজার কানেকশন পর্যন্ত স্কেল করতে পারে।
Fibers (PHP 8.1) Fibers আপনাকে কল স্ট্যাকের যেকোনো জায়গায় একটি ফাংশন পজ (pause) করার সুবিধা দেয়। একটি Fiber নিজে থেকে জেগে ওঠে না। এটি একটি পজ করা YouTube ভিডিওর মতো। এটিকে পুনরায় চালানোর জন্য কাউকে
$fiber->resume()কল করতে হবে।
হারিয়ে যাওয়া লিঙ্ক: PHP 8.6
Async I/O-এর জন্য তিনটি অংশ প্রয়োজন: • Pause: Fibers (এখন PHP কোরে রয়েছে) • Decide: The Event Loop (সাধারণ PHP কোড) • Know: Kernel Polling (যেখানে ঘাটতি ছিল)
এখন পর্যন্ত, পুরনো টুলস বা C এক্সটেনশন ব্যবহার না করে কোন সকেটটি প্রস্তুত তা "জানার" জন্য PHP-তে কোনো নেটিভ উপায় ছিল না।
PHP 8.6 এই ঘাটতি পূরণ করে। এটি কোরে একটি নেটিভ Polling API নিয়ে এসেছে। এটি Linux-এ স্বয়ংক্রিয়ভাবে epoll এবং Mac-এ kqueue ব্যবহার করবে।
মূল বিষয়টি (The Big Picture)
Async কোনো জাদু নয়। একটি event loop হলো কেবল এমন একটি PHP কোড যা সিদ্ধান্ত নেয় কখন একটি Fiber-এর ওপর resume() কল করতে হবে।
Fibers পজ করার ক্ষমতা দেয়। epoll কখন আনপজ (unpause) করতে হবে তা জানার বুদ্ধিমত্তা দেয়।
আপনি যদি শুধুমাত্র sync PHP ব্যবহার করেন, তবে আজই আপনার Laravel অ্যাপ পরিবর্তন করার প্রয়োজন নেই। কিন্তু এই মডেলটি বুঝতে পারলে ReactPHP বা Amp-এর মতো async লাইব্রেরিগুলো আয়ত্ত করা অনেক সহজ হয়ে যায়।
শুধু ব্যবহারকারী হবেন না, নিজে তৈরি করুন। কোডটি নিজে চালিয়ে দেখুন এটি কীভাবে কাজ করে।
