Inilah yang Saya Pelajari sebagai Pengembang PHP Sinkron tentang PHP Asinkron

Saya telah bekerja dengan Laravel selama bertahun-tahun. Saya menggunakan PHP sinkron. Sebuah permintaan datang, sebuah proses berjalan, dan sebuah respons dikirimkan. Saya tidak pernah membutuhkan asinkron.

Kemudian saya membaca tentang Polling API PHP 8.6 yang baru. Hal itu mengubah pandangan saya tentang bagaimana PHP menangani tugas.

Berikut adalah rincian tentang cara kerja asinkron.

Masalah dengan Blocking I/O

Saat Anda memanggil sebuah API, kode Anda menunggu. Contoh: $response = Http::get('https://api.example.com');

Jika API tersebut memakan waktu 300ms, proses PHP Anda tidak melakukan apa pun selama 300ms. Ia berada dalam status tidur (sleep). Ia menahan memori dan menempati slot worker. Jika semua worker Anda sedang tidur, server Anda akan berhenti menerima permintaan baru.

Solusi Asinkron

Asinkron memungkinkan Anda melakukan pekerjaan lain selama 300ms tersebut. Alih-alih menunggu, Anda menjalankan tugas lain.

Namun, bagaimana Anda tahu kapan datanya tiba? Di sinilah peran kernel.

Evolusi Polling

  1. select() PHP telah memiliki stream_select() sejak PHP 4. Ia bertanya kepada kernel: "Apakah ada data yang siap pada socket-socket ini?" Masalahnya adalah beban pemindaian ulang (rescan tax). Jika Anda memiliki 10.000 koneksi, Anda harus mengirimkan seluruh daftar ke kernel setiap saat. Ini lambat dan mencapai batas limit.

  2. epoll / kqueue Ini adalah fitur kernel, bukan fitur bahasa pemrograman. Linux menggunakan epoll. macOS menggunakan kqueue. Alih-alih memindai daftar lengkap, kernel mengelola daftar siap (ready-list). Ia hanya memberi tahu Anda socket spesifik mana yang memiliki data. Ini dapat diskalakan hingga ribuan koneksi tanpa biaya tambahan.

  3. Fibers (PHP 8.1) Fibers memungkinkan Anda menjeda sebuah fungsi di mana saja dalam call stack. Sebuah Fiber tidak bangun dengan sendirinya. Ini seperti video YouTube yang dijeda. Seseorang harus memanggil $fiber->resume() untuk memutarnya kembali.

Mata Rantai yang Hilang: PHP 8.6

I/O Asinkron membutuhkan tiga bagian: • Jeda (Pause): Fibers (Sekarang ada di inti PHP) • Putuskan (Decide): Event Loop (Kode PHP biasa) • Ketahui (Know): Kernel Polling (Celahnya)

Hingga saat ini, PHP kekurangan cara asli (native) untuk "mengetahui" socket mana yang siap tanpa menggunakan alat lama atau ekstensi C.

PHP 8.6 menutup celah ini. Ia menghadirkan Polling API asli ke dalam inti (core). Ia akan secara otomatis menggunakan epoll di Linux dan kqueue di Mac.

Gambaran Besarnya

Asinkron bukanlah sihir. Event loop hanyalah kode PHP yang memutuskan kapan harus memanggil resume() pada sebuah Fiber.

Fibers memberikan kemampuan untuk menjeda. epoll memberikan kecerdasan untuk mengetahui kapan harus melanjutkan (unpause).

Jika Anda hanya menggunakan PHP sinkron, Anda tidak perlu mengubah aplikasi Laravel Anda saat ini. Namun, memahami model ini membuat pustaka (library) asinkron seperti ReactPHP atau Amp jauh lebih mudah dikuasai.

Bangunlah, jangan hanya mengonsumsi. Jalankan kodenya sendiri untuk melihat cara kerjanya.

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