ਇੱਕ Sync PHP Developer ਵਜੋਂ ਮੈਂ Async PHP ਬਾਰੇ ਕੀ ਸਿੱਖਿਆ
ਮੈਂ ਸਾਲਾਂ ਤੱਕ Laravel ਨਾਲ ਕੰਮ ਕੀਤਾ ਹੈ। ਮੈਂ sync PHP ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਸੀ। ਇੱਕ request ਆਉਂਦੀ ਹੈ, ਇੱਕ process ਚੱਲਦੀ ਹੈ, ਅਤੇ ਇੱਕ response ਬਾਹਰ ਜਾਂਦਾ ਹੈ। ਮੈਨੂੰ ਕਦੇ ਵੀ async ਦੀ ਲੋੜ ਨਹੀਂ ਪਈ।
ਫਿਰ ਮੈਂ ਨਵੇਂ PHP 8.6 Polling API ਬਾਰੇ ਪੜ੍ਹਿਆ। ਇਸ ਨੇ PHP ਦੁਆਰਾ task ਸੰਭਾਲਣ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਮੇਰਾ ਨਜ਼ਰੀਆ ਬਦਲ ਦਿੱਤਾ।
ਇੱਥੇ ਇਸ ਗੱਲ ਦਾ ਵੇਰਵਾ ਦਿੱਤਾ ਗਿਆ ਹੈ ਕਿ async ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ।
Blocking I/O ਨਾਲ ਜੁੜੀ ਸਮੱਸਿਆ
ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ API ਨੂੰ ਕਾਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕੋਡ ਉਡੀਕ ਕਰਦਾ ਹੈ।
ਉਦਾਹਰਨ: $response = Http::get('https://api.example.com');
ਜੇਕਰ ਉਹ API 300ms ਲੈਂਦੀ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ PHP process 300ms ਲਈ ਕੁਝ ਨਹੀਂ ਕਰਦਾ। ਇਹ sleep state ਵਿੱਚ ਰਹਿੰਦਾ ਹੈ। ਇਹ memory ਨੂੰ ਰੋਕ ਕੇ ਰੱਖਦਾ ਹੈ ਅਤੇ ਇੱਕ worker slot ਨੂੰ ਘੇਰ ਲੈਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਹਾਡੇ ਸਾਰੇ workers ਸੌ ਰਹੇ ਹਨ, ਤਾਂ ਤੁਹਾਡਾ server ਨਵੀਆਂ requests ਸਵੀਕਾਰ ਕਰਨਾ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।
Async ਹੱਲ
Async ਤੁਹਾਨੂੰ ਉਹਨਾਂ 300ms ਦੌਰਾਨ ਹੋਰ ਕੰਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਉਡੀਕ ਕਰਨ ਦੀ ਬਜਾਏ, ਤੁਸੀਂ ਹੋਰ tasks ਚਲਾਉਂਦੇ ਹੋ।
ਪਰ ਤੁਹਾਨੂੰ ਇਹ ਕਿਵੇਂ ਪਤਾ ਲੱਗਦਾ ਹੈ ਕਿ ਡਾਟਾ ਕਦੋਂ ਆ ਰਿਹਾ ਹੈ? ਇੱਥੇ kernel ਦੀ ਭੂਮਿਕਾ ਆਉਂਦੀ ਹੈ।
Polling ਦਾ ਵਿਕਾਸ
select() PHP ਵਿੱਚ PHP 4 ਤੋਂ ਹੀ stream_select() ਮੌਜੂਦ ਹੈ। ਇਹ kernel ਨੂੰ ਪੁੱਛਦਾ ਹੈ: "ਕੀ ਇਹਨਾਂ sockets 'ਤੇ ਕੋਈ ਡਾਟਾ ਤਿਆਰ ਹੈ?" ਸਮੱਸਿਆ rescan tax ਦੀ ਹੈ। ਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ 10,000 connections ਹਨ, ਤਾਂ ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੂਰੀ ਲਿਸਟ kernel ਨੂੰ ਭੇਜਣੀ ਪਵੇਗੀ। ਇਹ ਹੌਲੀ ਹੈ ਅਤੇ ਸੀਮਾਵਾਂ (limits) ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦਾ ਹੈ।
epoll / kqueue ਇਹ ਇੱਕ kernel feature ਹੈ, ਨਾ ਕਿ language feature। Linux epoll ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। macOS kqueue ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਪੂਰੀ ਲਿਸਟ ਨੂੰ ਸਕੈਨ ਕਰਨ ਦੀ ਬਜਾਏ, kernel ਇੱਕ ready-list ਬਣਾਈ ਰੱਖਦਾ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਸਿਰਫ਼ ਇਹ ਦੱਸਦਾ ਹੈ ਕਿ ਕਿਹੜੇ ਖਾਸ sockets ਵਿੱਚ ਡਾਟਾ ਹੈ। ਇਹ ਬਿਨਾਂ ਕਿਸੇ ਵਾਧੂ ਲਾਗਤ ਦੇ ਹਜ਼ਾਰਾਂ connections ਤੱਕ ਵਿਸਤਾਰ (scale) ਕਰ ਸਕਦਾ ਹੈ।
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 (Plain PHP code) • Know: Kernel Polling (ਖਾਲੀ ਥਾਂ/gap)
ਹੁਣ ਤੱਕ, PHP ਕੋਲ ਪੁਰਾਣੇ ਟੂਲਸ ਜਾਂ C extensions ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਬਿਨਾਂ ਇਹ "ਜਾਣਨ" ਦਾ ਕੋਈ native ਤਰੀਕਾ ਨਹੀਂ ਸੀ ਕਿ ਕਿਹੜਾ socket ਤਿਆਰ ਹੈ।
PHP 8.6 ਇਸ gap ਨੂੰ ਭਰਦਾ ਹੈ। ਇਹ core ਵਿੱਚ ਇੱਕ native Polling API ਲਿਆਉਂਦਾ ਹੈ। ਇਹ Linux 'ਤੇ ਆਪਣੇ ਆਪ epoll ਅਤੇ Mac 'ਤੇ kqueue ਦੀ ਵਰਤੋਂ ਕਰੇਗਾ।
ਵੱਡੀ ਤਸਵੀਰ (The Big Picture)
Async ਕੋਈ ਜਾਦੂ ਨਹੀਂ ਹੈ। ਇੱਕ event loop ਸਿਰਫ਼ PHP ਕੋਡ ਹੈ ਜੋ ਇਹ ਫੈਸਲਾ ਕਰਦਾ ਹੈ ਕਿ ਕਿਸੇ Fiber 'ਤੇ resume() ਕਦੋਂ ਕਾਲ ਕਰਨਾ ਹੈ।
Fibers ਰੋਕਣ (pause) ਦੀ ਸਮਰੱਥਾ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ। epoll ਇਹ ਜਾਣਨ ਦੀ ਸਮਝ (intelligence) ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਕਿ ਕਦੋਂ unpause ਕਰਨਾ ਹੈ।
ਜੇਕਰ ਤੁਸੀਂ ਸਿਰਫ਼ sync PHP ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਅੱਜ ਆਪਣੀਆਂ Laravel apps ਬਦਲਣ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। ਪਰ ਇਸ ਮਾਡਲ ਨੂੰ ਸਮਝਣ ਨਾਲ ReactPHP ਜਾਂ Amp ਵਰਗੀਆਂ async libraries ਵਿੱਚ ਮਾਹਰ ਹੋਣਾ ਬਹੁਤ ਆਸਾਨ ਹੋ ਜਾਂਦਾ ਹੈ।
ਸਿਰਫ਼ ਵਰਤੋਂ ਨਾ ਕਰੋ, ਬਣਾਉਣਾ ਸਿੱਖੋ। ਇਹ ਦੇਖਣ ਲਈ ਕਿ ਇਹ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ, ਖੁਦ ਕੋਡ ਚਲਾ ਕੇ ਦੇਖੋ।
