एक Sync PHP डेव्हलपर म्हणून मी Async PHP बद्दल काय शिकलो

मी अनेक वर्षे Laravel सोबत काम केले आहे. मी sync PHP वापरत होतो. एक रिक्वेस्ट येते, एक प्रोसेस चालते आणि रिस्पॉन्स बाहेर जातो. मला कधीही async ची गरज भासली नाही.

मग मी नवीन PHP 8.6 Polling API बद्दल वाचले. PHP टास्क कसे हाताळते याबद्दलचा माझा दृष्टिकोन यामुळे बदलला.

Async कसे काम करते याचा तपशील खालीलप्रमाणे आहे.

Blocking I/O मधील समस्या

जेव्हा तुम्ही एखादे API कॉल करता, तेव्हा तुमचा कोड थांबतो (wait करतो). उदाहरण: $response = Http::get('https://api.example.com');

जर त्या API ला ३००ms लागले, तर तुमचा PHP प्रोसेस ३००ms पर्यंत काहीच करत नाही. तो 'sleep state' मध्ये असतो. तो मेमरी व्यापतो आणि एका वर्कर स्लॉटचा ताबा घेतो. जर तुमचे सर्व वर्कर्स 'sleep' मोडमध्ये असतील, तर तुमचा सर्व्हर नवीन रिक्वेस्ट स्वीकारणे थांबवतो.

Async उपाय

Async तुम्हाला त्या ३००ms दरम्यान इतर कामे करण्याची परवानगी देते. थांबण्याऐवजी, तुम्ही इतर टास्क रन करू शकता.

पण डेटा कधी येईल हे तुम्हाला कसे कळणार? इथेच 'kernel' ची भूमिका येते.

Polling ची उत्क्रांती

  1. select() PHP 4 पासून stream_select() उपलब्ध आहे. ते kernel ला विचारते: "या sockets वर काही डेटा तयार आहे का?" समस्या म्हणजे 'rescan tax'. जर तुमच्याकडे १०,००० कनेक्शन्स असतील, तर तुम्हाला प्रत्येक वेळी संपूर्ण लिस्ट kernel ला पाठवावी लागते. हे संथ आहे आणि मर्यादांवर (limits) परिणाम करते.

  2. epoll / kqueue हे एक kernel फीचर आहे, लँग्वेज फीचर नाही. Linux मध्ये epoll वापरले जाते आणि macOS मध्ये kqueue. संपूर्ण लिस्ट स्कॅन करण्याऐवजी, kernel एक 'ready-list' मेंटेन करते. फक्त कोणत्या विशिष्ट sockets कडे डेटा आहे, हेच ते तुम्हाला सांगते. यामुळे अतिरिक्त खर्च न करता हजारो कनेक्शन्स हाताळणे शक्य होते.

  3. Fibers (PHP 8.1) Fibers तुम्हाला कॉल स्टॅक मध्ये कुठेही फंक्शन थांबवण्याची (pause करण्याची) परवानगी देतात. एक Fiber स्वतःहून जागृत होत नाही. ते थांबलेल्या YouTube व्हिडिओसारखे आहे. ते पुन्हा प्ले करण्यासाठी कोणालातरी $fiber->resume() कॉल करावे लागेल.

हरवलेली दुवा: PHP 8.6

Async I/O साठी तीन भागांची आवश्यकता असते: • Pause: Fibers (आता PHP core मध्ये उपलब्ध) • Decide: The Event Loop (साधा PHP कोड) • Know: Kernel Polling (हीच उणीव होती)

आतापर्यंत, जुनी साधने किंवा C extensions न वापरता कोणता socket तयार आहे हे "जाणून घेण्याचा" (know) PHP कडे कोणताही नेटिव्ह मार्ग नव्हता.

PHP 8.6 ही उणीव भरून काढते. ते core मध्ये नेटिव्ह Polling API आणते. हे Linux वर आपोआप epoll आणि Mac वर kqueue वापरेल.

मोठे चित्र (The Big Picture)

Async ही जादू नाही. Event loop हा फक्त एक PHP कोड आहे जो ठरवतो की Fiber वर resume() कधी कॉल करायचे.

Fibers थांबवण्याची क्षमता देतात. epoll कधी अनपॉज (unpause) करायचे हे जाणून घेण्याची बुद्धिमत्ता देते.

जर तुम्ही फक्त sync PHP वापरत असाल, तर तुम्हाला आज तुमचे Laravel apps बदलण्याची गरज नाही. परंतु, हे मॉडेल समजून घेतल्यास ReactPHP किंवा Amp सारखी async लायब्ररी आत्मसात करणे खूप सोपे होईल.

फक्त वापरू नका, तर स्वतः तयार करा. ते कसे काम करते हे पाहण्यासाठी स्वतः कोड रन करून पहा.

स्रोत: https://dev.to/alamriku/sync-php-developer-hisebe-async-php-bujhte-giye-yaa-shikhlaam-fibers-epoll-aar-php-86-462j