Inilah yang Saya Pelajari Sebagai Pembangun PHP Sync Tentang PHP Async

Saya telah bekerja dengan Laravel selama bertahun-tahun. Saya menggunakan PHP sync. Satu permintaan datang, satu proses berjalan, dan satu respons dihantar. Saya tidak pernah memerlukan async.

Kemudian saya membaca tentang API Polling PHP 8.6 yang baharu. Ia mengubah pandangan saya tentang cara PHP mengendalikan tugasan.

Berikut adalah pecahan tentang bagaimana async berfungsi.

Masalah dengan Blocking I/O

Apabila anda memanggil satu API, kod anda akan menunggu. Contoh: $response = Http::get('https://api.example.com');

Jika API tersebut mengambil masa 300ms, proses PHP anda tidak melakukan apa-apa selama 300ms. Ia berada dalam keadaan 'sleep'. Ia memegang memori dan memenuhi slot pekerja (worker). Jika semua pekerja anda sedang 'sleep', pelayan anda akan berhenti menerima permintaan baharu.

Penyelesaian Async

Async membolehkan anda melakukan kerja lain dalam tempoh 300ms tersebut. Daripada menunggu, anda menjalankan tugasan lain.

Tetapi bagaimana anda tahu bila data tiba? Di sinilah peranan kernel bermula.

Evolusi Polling

  1. select() PHP telah mempunyai stream_select() sejak PHP 4. Ia bertanya kepada kernel: "Adakah sebarang data sedia pada soket-soket ini?" Masalahnya ialah 'rescan tax'. Jika anda mempunyai 10,000 sambungan, anda mesti menghantar keseluruhan senarai kepada kernel setiap kali. Ini adalah perlahan dan mencapai had limit.

  2. epoll / kqueue Ini adalah ciri kernel, bukan ciri bahasa pengaturcaraan. Linux menggunakan epoll. macOS menggunakan kqueue. Daripada mengimbas senarai penuh, kernel mengekalkan 'ready-list'. Ia hanya memberitahu anda soket spesifik mana yang mempunyai data. Ini boleh diskalakan kepada beribu-ribu sambungan tanpa kos tambahan.

  3. Fibers (PHP 8.1) Fibers membolehkan anda menjeda (pause) satu fungsi di mana-mana sahaja dalam timbunan panggilan (call stack). Sebuah Fiber tidak akan bangun dengan sendirinya. Ia seperti video YouTube yang dijeda. Seseorang mesti memanggil $fiber->resume() untuk memainkannya semula.

Pautan yang Hilang: PHP 8.6

Async I/O memerlukan tiga bahagian: • Pause: Fibers (Kini dalam teras PHP) • Decide: The Event Loop (Kod PHP biasa) • Know: Kernel Polling (Jurang yang wujud)

Sehingga kini, PHP kekurangan cara asli untuk "tahu" soket mana yang sedia tanpa menggunakan alatan lama atau sambungan C (C extensions).

PHP 8.6 menutup jurang ini. Ia membawa API Polling asli ke dalam teras. Ia akan menggunakan epoll secara automatik pada Linux dan kqueue pada Mac.

Gambaran Besar

Async bukanlah magis. Satu event loop hanyalah kod PHP yang memutuskan bila untuk memanggil resume() pada sebuah Fiber.

Fibers menyediakan keupayaan untuk menjeda. epoll menyediakan kecerdasan untuk mengetahui bila untuk menyambung semula (unpause).

Jika anda hanya menggunakan PHP sync, anda tidak perlu mengubah aplikasi Laravel anda hari ini. Tetapi memahami model ini menjadikan perpustakaan (library) async seperti ReactPHP atau Amp jauh lebih mudah untuk dikuasai.

Bina, jangan sekadar guna. Jalankan kod itu sendiri untuk melihat bagaimana ia berfungsi.

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