ಒಬ್ಬ Sync PHP ಡೆವಲಪರ್ ಆಗಿ Async PHP ಬಗ್ಗೆ ನಾನು ಕಲಿತದ್ದು ಇಲ್ಲಿದೆ

ನಾನು ವರ್ಷಗಟ್ಟಲೆ Laravel ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಿದ್ದೇನೆ. ನಾನು sync PHP ಬಳಸುತ್ತಿದ್ದೆ. ಒಂದು ರಿಕ್ವೆಸ್ಟ್ ಬರುತ್ತದೆ, ಒಂದು ಪ್ರಕ್ರಿಯೆ ನಡೆಯುತ್ತದೆ ಮತ್ತು ರೆಸ್ಪಾನ್ಸ್ ಹೊರಹೋಗುತ್ತದೆ. ನನಗೆ ಎಂದಿಗೂ async ಅಗತ್ಯವಿರಲಿಲ್ಲ.

ನಂತರ ನಾನು ಹೊಸ PHP 8.6 Polling API ಬಗ್ಗೆ ಓದಿದೆ. PHP ಕಾರ್ಯಗಳನ್ನು (tasks) ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬ ಬಗ್ಗೆ ಅದು ನನ್ನ ದೃಷ್ಟಿಕೋನವನ್ನೇ ಬದಲಿಸಿತು.

async ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಎಂಬ ವಿವರ ಇಲ್ಲಿದೆ.

Blocking I/O ನ ಸಮಸ್ಯೆ

ನೀವು ಒಂದು API ಅನ್ನು ಕರೆ ಮಾಡಿದಾಗ, ನಿಮ್ಮ ಕೋಡ್ ಕಾಯುತ್ತದೆ. ಉದಾಹರಣೆ: $response = Http::get('https://api.example.com');

ಆ API 300ms ತೆಗೆದುಕೊಳ್ಳುವಲ್ಲಿ, ನಿಮ್ಮ PHP ಪ್ರಕ್ರಿಯೆಯು (process) ಆ 300ms 동안 ಏನನ್ನೂ ಮಾಡದೆ ಇರುತ್ತದೆ. ಅದು 'sleep state' ನಲ್ಲಿ ಇರುತ್ತದೆ. ಇದು ಮೆಮೊರಿಯನ್ನು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ವರ್ಕರ್ ಸ್ಲಾಟ್ ಅನ್ನು ಆಕ್ರಮಿಸುತ್ತದೆ. ನಿಮ್ಮ ಎಲ್ಲಾ ವರ್ಕರ್ಸ್‌ಗಳು ನಿದ್ರಿಸುತ್ತಿದ್ದರೆ (sleeping), ನಿಮ್ಮ ಸರ್ವರ್ ಹೊಸ ರಿಕ್ವೆಸ್ಟ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ.

Async ಪರಿಹಾರ

ಆ 300ms ಸಮಯದಲ್ಲಿ ಇತರ ಕೆಲಸಗಳನ್ನು ಮಾಡಲು async ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಕಾಯುವ ಬದಲು, ನೀವು ಇತರ ಕಾರ್ಯಗಳನ್ನು ಮಾಡಬಹುದು.

ಆದರೆ ಡೇಟಾ ಯಾವಾಗ ಬರುತ್ತದೆ ಎಂದು ನಿಮಗೆ ಹೇಗೆ ತಿಳಿಯುತ್ತದೆ? ಇಲ್ಲಿಯೇ kernel ಪಾತ್ರ ವಹಿಸುತ್ತದೆ.

Polling ನ ವಿಕಸನ

  1. select() PHP 4 ರಿಂದಲೂ PHP ನಲ್ಲಿ stream_select() ಇದೆ. ಇದು kernel ಅನ್ನು ಕೇಳುತ್ತದೆ: "ಈ ಸಾಕೆಟ್‌ಗಳಲ್ಲಿ (sockets) ಯಾವುದಾದರೂ ಡೇಟಾ ಸಿದ್ಧವಿದೆಯೇ?" ಇದರ ಸಮಸ್ಯೆ 'rescan tax'. ನಿಮ್ಮ ಬಳಿ 10,000 ಕನೆಕ್ಷನ್‌ಗಳಿದ್ದರೆ, ನೀವು ಪ್ರತಿ ಬಾರಿಯೂ ಸಂಪೂರ್ಣ ಪಟ್ಟಿಯನ್ನು kernel ಗೆ ಕಳುಹಿಸಬೇಕಾಗುತ್ತದೆ. ಇದು ನಿಧಾನ ಮತ್ತು ಮಿತಿಗಳನ್ನು ತಲುಪುತ್ತದೆ.

  2. epoll / kqueue ಇದು kernel ಫೀಚರ್ ಆಗಿದೆಯೇ ಹೊರತು ಭಾಷೆಯ (language) ಫೀಚರ್ ಅಲ್ಲ. Linux epoll ಅನ್ನು ಬಳಸುತ್ತದೆ. macOS kqueue ಅನ್ನು ಬಳಸುತ್ತದೆ. ಸಂಪೂರ್ಣ ಪಟ್ಟಿಯನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ ಬದಲು, kernel ಒಂದು 'ready-list' ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಯಾವ ನಿರ್ದಿಷ್ಟ ಸಾಕೆಟ್‌ಗಳಲ್ಲಿ ಡೇಟಾ ಇದೆ ಎಂಬುದನ್ನು ಮಾತ್ರ ಅದು ನಿಮಗೆ ತಿಳಿಸುತ್ತದೆ. ಇದು ಯಾವುದೇ ಹೆಚ್ಚಿನ ವೆಚ್ಚವಿಲ್ಲದೆ ಸಾವಿರಾರು ಕನೆಕ್ಷನ್‌ಗಳಿಗೆ ವಿಸ್ತರಿಸುತ್ತದೆ (scales).

  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 (ಅಂತರ/ಕಣ್ಮರೆ)

ಇಲ್ಲಿಯವರೆಗೆ, ಹಳೆಯ ಪರಿಕರಗಳು ಅಥವಾ C extensions ಬಳಸದೆ ಯಾವ ಸಾಕೆಟ್ ಸಿದ್ಧವಾಗಿದೆ ಎಂದು "ತಿಳಿಯಲು" PHP ಬಳಿ ನೈಸರ್ಗಿಕ (native) ಮಾರ್ಗವಿರಲಿಲ್ಲ.

PHP 8.6 ಈ ಅಂತರವನ್ನು ತುಂಬುತ್ತದೆ. ಇದು core ಗೆ ನೈಸರ್ಗಿಕ Polling API ಅನ್ನು ತರುತ್ತದೆ. ಇದು Linux ನಲ್ಲಿ epoll ಮತ್ತು Mac ನಲ್ಲಿ kqueue ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬಳಸುತ್ತದೆ.

ದೊಡ್ಡ ಚಿತ್ರಣ (The Big Picture)

Async ಎಂಬುದು ಮಾಯೆಯಲ್ಲ. Event loop ಎಂಬುದು ಕೇವಲ ಒಂದು Fiber ಮೇಲೆ ಯಾವಾಗ resume() ಅನ್ನು ಕರೆಯಬೇಕೆಂದು ನಿರ್ಧರಿಸುವ PHP ಕೋಡ್ ಆಗಿದೆ.

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