ఒక 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) స్టేట్‌లో ఉంటుంది. ఇది మెమరీని ఆక్రమిస్తుంది మరియు ఒక వర్కర్ స్లాట్‌ను నిలుపుకుంటుంది. మీ వర్కర్లందరూ స్లీప్ స్టేట్‌లో ఉంటే, మీ సర్వర్ కొత్త రిక్వెస్ట్‌లను స్వీకరించడం ఆపేస్తుంది.

Async పరిష్కారం

ఆ 300ms సమయంలో ఇతర పనులను చేయడానికి Async మీకు అనుమతిస్తుంది. వేచి ఉండటానికి బదులుగా, మీరు ఇతర పనులను రన్ చేయవచ్చు.

కానీ డేటా ఎప్పుడు వస్తుందో మీకు ఎలా తెలుస్తుంది? ఇక్కడే kernel పాత్ర మొదలవుతుంది.

Polling యొక్క పరిణామం

  1. select() PHP 4 నుండి stream_select() అందుబాటులో ఉంది. ఇది kernelని ఇలా అడుగుతుంది: "ఈ సాకెట్‌లలో ఏదైనా డేటా సిద్ధంగా ఉందా?" ఇక్కడ సమస్య 'rescan tax'. మీకు 10,000 కనెక్షన్లు ఉంటే, మీరు ప్రతిసారీ మొత్తం జాబితాను kernelకి పంపాల్సి ఉంటుంది. ఇది నెమ్మదిగా ఉంటుంది మరియు పరిమితులను చేరుకుంటుంది.

  2. epoll / kqueue ఇది ఒక kernel ఫీచర్, భాషా ఫీచర్ (language feature) కాదు. Linux epollని ఉపయోగిస్తుంది. macOS kqueueని ఉపయోగిస్తుంది. పూర్తి జాబితాను స్కాన్ చేయడానికి బదులుగా, kernel ఒక ready-listని నిర్వహిస్తుంది. ఏ నిర్దిష్ట సాకెట్‌లలో డేటా ఉందో అది మాత్రమే మీకు చెబుతుంది. ఇది అదనపు ఖర్చు లేకుండా వేలకొద్దీ కనెక్షన్లకు కూడా పనిచేస్తుంది.

  3. Fibers (PHP 8.1) Fibers కాల్ స్టాక్ (call stack)లో ఎక్కడైనా ఒక ఫంక్షన్‌ను పాజ్ (pause) చేయడానికి అనుమతిస్తాయి. ఒక Fiber తనంతట తానుగా మేల్కొనదు. ఇది పాజ్ చేసిన YouTube వీడియో లాంటిది. దానిని మళ్ళీ ప్లే చేయడానికి ఎవరో ఒకరు $fiber->resume()ని కాల్ చేయాలి.

మిస్సింగ్ లింక్: PHP 8.6

Async I/O కి మూడు భాగాలు అవసరం: • Pause: Fibers (ఇప్పుడు PHP కోర్‌లో ఉన్నాయి) • Decide: The Event Loop (సాధారణ PHP కోడ్) • Know: Kernel Polling (అదే లోటు/గ్యాప్)

ఇప్పటి వరకు, పాత టూల్స్ లేదా C extensions ఉపయోగించకుండా ఏ సాకెట్ సిద్ధంగా ఉందో "తెలుసుకోవడానికి" PHPకి నేటివ్ మార్గం లేదు.

PHP 8.6 ఈ లోటును పూరిస్తుంది. ఇది కోర్‌లోకి నేటివ్ Polling APIని తీసుకువస్తుంది. ఇది Linuxలో ఆటోమేటిక్‌గా epollని మరియు Macలో kqueueని ఉపయోగిస్తుంది.

ముఖ్యమైన విషయం (The Big Picture)

Async అనేది మ్యాజిక్ కాదు. ఒక event loop అనేది కేవలం ఒక Fiber పై ఎప్పుడు resume()ని కాల్ చేయాలో నిర్ణయించే PHP కోడ్ మాత్రమే.

Fibers పాజ్ చేసే సామర్థ్యాన్ని ఇస్తాయి. epoll ఎప్పుడు unpause చేయాలో తెలిసే తెలివితేటలను అందిస్తుంది.

మీరు కేవలం sync PHPని మాత్రమే ఉపయోగిస్తుంటే, ఈరోజు మీ Laravel యాప్‌లను మార్చాల్సిన అవసరం లేదు. కానీ ఈ మోడల్‌ను అర్థం చేసుకోవడం వల్ల ReactPHP లేదా Amp వంటి async లైబ్రరీలను సులభంగా నేర్చుకోవచ్చు.

కేవలం వాడుకోవడమే కాకుండా, స్వయంగా నిర్మించండి. అది ఎలా పనిచేస్తుందో చూడటానికి కోడ్‌ను మీరే రన్ చేయండి.

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