Selamat datang di bagian ke-55 dari seri tutorial pemrograman PHP lengkap kami! Di bagian ini, kita akan menyelami pemrograman asinkronus di PHP menggunakan ReactPHP. Pemrograman asinkronus memungkinkan aplikasi Anda melakukan banyak tugas secara bersamaan tanpa memblokir eksekusi utama, meningkatkan kinerja dan daya tanggap aplikasi Anda. Bagian ini sangat penting setelah mempelajari arsitektur microservice, karena komunikasi antar microservice seringkali bisa ditingkatkan dengan mekanisme asinkronus.
Prasyarat:
Asinkronus vs Sinkronus: Bayangkan Anda sedang memesan makanan di restoran. Dalam eksekusi sinkronus, Anda akan menunggu pesanan Anda selesai sebelum melakukan hal lain. Dalam eksekusi asinkronus, Anda memesan makanan, lalu melakukan hal lain (misalnya membaca buku), dan pelayan akan memanggil Anda ketika makanan Anda siap.
ReactPHP adalah pustaka event-driven, non-blocking I/O untuk PHP. Ini memungkinkan Anda menulis aplikasi yang menangani beberapa koneksi secara bersamaan tanpa menggunakan thread atau proses terpisah.
Inti dari ReactPHP adalah event loop. Event loop memantau berbagai sumber (misalnya soket, timer, sinyal) dan memicu callback saat suatu peristiwa terjadi. Ini memungkinkan Anda menulis kode non-blocking yang responsif dan efisien.
Mari kita buat server HTTP sederhana menggunakan ReactPHP yang merespons permintaan secara asinkronus.
Gunakan Composer untuk menginstal komponen yang diperlukan:
composer require react/react react/http
Buat file bernama server.php dengan konten berikut:
'text/plain'],
"Hello, World!\n"
);
});
$socket = new \React\Socket\Server(1337, $loop);
$server->listen($socket);
echo 'Server listening on port 1337.\n';
$loop->run();
Penjelasan Kode:
require __DIR__ . '/vendor/autoload.php';: Menyertakan autoloader Composer untuk memuat pustaka ReactPHP.use React\Http\Server;, use React\Http\Response;, use React\EventLoop\Factory;: Mengimpor kelas-kelas yang diperlukan dari ReactPHP.$loop = Factory::create();: Membuat instance event loop.$server = new Server($loop, function (ServerRequestInterface $request) { ... });: Membuat server HTTP yang menangani setiap permintaan dengan fungsi callback.return new Response(200, ['Content-Type' => 'text/plain'], "Hello, World!\n");: Membuat respons HTTP dengan kode status 200, header Content-Type, dan isi "Hello, World!".$socket = new \React\Socket\Server(1337, $loop);: Membuat soket yang mendengarkan koneksi pada port 1337.$server->listen($socket);: Mengarahkan server HTTP untuk mendengarkan koneksi pada soket.echo 'Server listening on port 1337.\n';: Menampilkan pesan bahwa server sedang berjalan.$loop->run();: Memulai event loop, yang akan terus berjalan sampai dihentikan secara manual.Buka terminal dan jalankan server dengan perintah berikut:
php server.php
Anda akan melihat pesan "Server listening on port 1337."
Buka browser Anda dan kunjungi http://localhost:1337. Anda akan melihat pesan "Hello, World!"
sleep() atau fungsi database blocking) di dalam event loop, karena ini akan memblokir seluruh aplikasi. Gunakan fungsi non-blocking atau pustaka yang mendukung ReactPHP.try-catch atau mekanisme penanganan kesalahan lain untuk mencegah aplikasi Anda crash.Ubah server HTTP di atas untuk membaca isi file secara asinkronus dan menampilkannya sebagai respons. Gunakan fungsi React\Filesystem\Filesystem::readFile() untuk membaca file secara non-blocking.