ایک 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 300ms لیتی ہے، تو آپ کا PHP پروسیس 300ms تک کچھ نہیں کرتا۔ یہ sleep state میں رہتا ہے۔ یہ میموری استعمال کرتا ہے اور ایک ورکر سلاٹ (worker slot) گھیر لیتا ہے۔ اگر آپ کے تمام ورکرز سو رہے ہوں، تو آپ کا سرور نئی ریکویسٹس قبول کرنا بند کر دیتا ہے۔

Async کا حل

Async آپ کو ان 300ms کے دوران دوسرا کام کرنے کی اجازت دیتا ہے۔ انتظار کرنے کے بجائے، آپ دوسرے ٹاسک چلا سکتے ہیں۔

لیکن آپ کو کیسے پتہ چلے گا کہ ڈیٹا کب پہنچا؟ یہیں پر kernel کا کردار شروع ہوتا ہے۔

Polling کا ارتقاء

  1. select() PHP میں PHP 4 سے stream_select() موجود ہے۔ یہ kernel سے پوچھتا ہے: "کیا ان sockets پر کوئی ڈیٹا تیار ہے؟" مسئلہ rescan tax کا ہے۔ اگر آپ کے پاس 10,000 کنکشنز ہیں، تو آپ کو ہر بار پوری لسٹ kernel کو بھیجنی پڑتی ہے۔ یہ عمل سست ہے اور حد (limits) کو متاثر کرتا ہے۔

  2. epoll / kqueue یہ ایک kernel فیچر ہے، زبان (language) کا فیچر نہیں۔ Linux epoll استعمال کرتا ہے۔ macOS kqueue استعمال کرتا ہے۔ پوری لسٹ کو اسکین کرنے کے بجائے، kernel ایک ready-list برقرار رکھتا ہے۔ یہ آپ کو صرف یہ بتاتا ہے کہ کن مخصوص sockets پر ڈیٹا موجود ہے۔ یہ اضافی لاگت کے بغیر ہزاروں کنکشنز تک پھیل سکتا ہے۔

  3. Fibers (PHP 8.1) Fibers آپ کو call stack میں کہیں بھی کسی فنکشن کو روکنے (pause کرنے) کی اجازت دیتے ہیں۔ ایک Fiber خود بخود نہیں جاگتا۔ یہ ایک رکے ہوئے YouTube ویڈیو کی طرح ہے۔ اسے دوبارہ چلانے کے لیے کسی کو $fiber->resume() کال کرنا پڑتا ہے۔

گمشدہ کڑی: PHP 8.6

Async I/O کے لیے تین حصوں کی ضرورت ہوتی ہے: • Pause: Fibers (اب PHP core میں موجود ہیں) • Decide: The Event Loop (عام PHP کوڈ) • Know: Kernel Polling (وہ خلا جو پہلے موجود تھا)

اب تک، PHP کے پاس پرانے ٹولز یا C extensions استعمال کیے بغیر یہ "جاننے" کا کوئی فطری (native) طریقہ نہیں تھا کہ کون سا socket تیار ہے۔

PHP 8.6 اس خلا کو پُر کرتا ہے۔ یہ core میں ایک native Polling API لاتا ہے۔ یہ خود بخود Linux پر epoll اور Mac پر kqueue استعمال کرے گا۔

مکمل تصویر

Async کوئی جادو نہیں ہے۔ Event loop محض PHP کوڈ ہے جو یہ فیصلہ کرتا ہے کہ کب کسی Fiber پر resume() کال کرنا ہے۔

Fibers روکنے (pause) کی صلاحیت فراہم کرتے ہیں۔ epoll یہ جاننے کی ذہانت فراہم کرتا ہے کہ کب دوبارہ شروع (unpause) کرنا ہے۔

اگر آپ صرف sync PHP استعمال کرتے ہیں، تو آج آپ کو اپنی Laravel ایپس تبدیل کرنے کی ضرورت نہیں ہے۔ لیکن اس ماڈل کو سمجھنے سے ReactPHP یا Amp جیسی async لائبریریز پر مہارت حاصل کرنا بہت آسان ہو جاتا ہے۔

صرف استعمال نہ کریں، بلکہ خود بنائیں (Build)۔ یہ دیکھنے کے لیے کہ یہ کیسے کام کرتا ہے، خود کوڈ چلا کر دیکھیں۔

Source: https://dev.to/alamriku/sync-php-developer-hisebe-async-php-bujhte-giye-yaa-shikhlaam-fibers-epoll-aar-php-86-462j