ஒரு Sync PHP டெவலப்பராக Async PHP பற்றி நான் கற்றுக்கொண்டவை
நான் பல ஆண்டுகளாக Laravel உடன் பணியாற்றியுள்ளேன். நான் sync PHP-யைப் பயன்படுத்தினேன். ஒரு கோரிக்கை (request) வருகிறது, ஒரு செயல்முறை (process) இயங்குகிறது, மற்றும் ஒரு பதில் (response) அனுப்பப்படுகிறது. எனக்கு async ஒருபோதும் தேவைப்படவில்லை.
பின்னர் புதிய PHP 8.6 Polling API பற்றி படித்தேன். PHP பணிகளைக் கையாளும் விதம் குறித்த எனது பார்வையை அது மாற்றியது.
async எவ்வாறு செயல்படுகிறது என்பதன் விளக்கம் இதோ.
Blocking I/O-வில் உள்ள சிக்கல்
நீங்கள் ஒரு API-யை அழைக்கும்போது, உங்கள் குறியீடு (code) காத்திருக்கும்.
உதாரணம்: $response = Http::get('https://api.example.com');
அந்த API 300ms எடுத்துக் கொண்டால், உங்கள் PHP செயல்முறை அந்த 300ms காலத்திற்கு எதையும் செய்யாமல் இருக்கும். அது ஒரு தூக்க நிலையில் (sleep state) இருக்கும். இது நினைவகத்தை (memory) பிடித்துக் கொள்ளும் மற்றும் ஒரு worker இடத்தைப் பிடிக்கும். உங்கள் அனைத்து workers-களும் தூங்கிக்கொண்டிருந்தால், உங்கள் சர்வர் புதிய கோரிக்கைகளை ஏற்றுக்கொள்வதை நிறுத்திவிடும்.
Async தீர்வு
அந்த 300ms காலப்பகுதியில் மற்ற வேலைகளைச் செய்ய async அனுமதிக்கிறது. காத்திருப்பதற்குப் பதிலாக, நீங்கள் மற்ற பணிகளைச் செய்யலாம்.
ஆனால் தரவு எப்போது வரும் என்பதை நீங்கள் எப்படி அறிவீர்கள்? இங்கேதான் kernel முக்கியப் பங்கு வகிக்கிறது.
Polling-ன் பரிணாம வளர்ச்சி
select() PHP 4 முதல் PHP-யில் stream_select() உள்ளது. இது kernel-இடம் கேட்கிறது: "இந்த sockets-களில் ஏதேனும் தரவு தயாராக உள்ளதா?" இதில் உள்ள சிக்கல் rescan tax ஆகும். உங்களிடம் 10,000 இணைப்புகள் (connections) இருந்தால், ஒவ்வொரு முறையும் முழுப் பட்டியலையும் kernel-க்கு அனுப்ப வேண்டும். இது மெதுவாக இருக்கும் மற்றும் வரம்புகளைத் தாண்டும்.
epoll / kqueue இது ஒரு kernel அம்சம், மொழியின் அம்சம் அல்ல. Linux epoll-ஐப் பயன்படுத்துகிறது. macOS kqueue-ஐப் பயன்படுத்துகிறது. முழுப் பட்டியலையும் ஸ்கேன் செய்வதற்குப் பதிலாக, kernel ஒரு ready-list-ஐப் பராமரிக்கிறது. எந்த குறிப்பிட்ட sockets-களில் தரவு உள்ளது என்பதை மட்டுமே அது உங்களுக்குத் தெரிவிக்கும். இது கூடுதல் செலவின்றி ஆயிரக்கணக்கான இணைப்புகளுக்குத் தடையின்றிச் செயல்படும்.
Fibers (PHP 8.1) Fibers மூலம் call stack-ல் எந்த இடத்திலும் ஒரு function-ஐ இடைநிறுத்த (pause) முடியும். ஒரு Fiber தானாகவே விழிப்படையாது. இது இடைநிறுத்தப்பட்ட ஒரு YouTube வீடியோவைப் போன்றது. அதை மீண்டும் இயக்க யாராவது
$fiber->resume()என்று அழைக்க வேண்டும்.
விடுபட்ட இணைப்பு: PHP 8.6
Async I/O-விற்கு மூன்று பகுதிகள் தேவை: • Pause: Fibers (இப்போது PHP core-இல் உள்ளது) • Decide: The Event Loop (சாதாரண PHP code) • Know: Kernel Polling (விடுபட்ட பகுதி)
இதுவரை, பழைய கருவிகள் அல்லது C extensions-களைப் பயன்படுத்தாமல், எந்த socket தயாராக உள்ளது என்பதை "அறிந்துகொள்ள" PHP-யில் ஒரு native வழி இல்லை.
PHP 8.6 இந்த இடைவெளியை நிரப்புகிறது. இது core-க்கு ஒரு native Polling API-யைக் கொண்டுவருகிறது. இது Linux-இல் தானாகவே epoll மற்றும் Mac-இல் kqueue-ஐப் பயன்படுத்தும்.
முழுமையான பார்வை
Async என்பது மந்திரம் அல்ல. ஒரு event loop என்பது ஒரு Fiber-இல் எப்போது resume() அழைக்க வேண்டும் என்று தீர்மானிக்கும் ஒரு PHP code மட்டுமே.
Fibers இடைநிறுத்தும் திறனை வழங்குகின்றன. epoll எப்போது மீண்டும் தொடங்குவது என்பதை அறியும் அறிவாற்றலை வழங்குகிறது.
நீங்கள் sync PHP-யை மட்டுமே பயன்படுத்துகிறீர்கள் என்றால், இன்று உங்கள் Laravel செயலிகளை மாற்ற வேண்டிய அவசியமில்லை. ஆனால் இந்த மாதிரியைப் புரிந்துகொள்வது ReactPHP அல்லது Amp போன்ற async libraries-களை எளிதாகக் கற்றுக்கொள்ள உதவும்.
வெறும் பயனராக மட்டும் இருக்காமல், உருவாக்குபவராக மாறுங்கள். இது எவ்வாறு செயல்படுகிறது என்பதைப் பார்க்க நீங்களே குறியீட்டை இயக்கிப் பாருங்கள்.
