PHP, sebagai bahasa skrip dinamik, digunakan secara meluas dalam bidang pembangunan web. Dalam PHP, kami biasanya menggunakan model IO yang menyekat untuk mengendalikan permintaan pelanggan, iaitu, setiap permintaan memerlukan urutan untuk diproses, yang menggunakan banyak sumber pelayan. Untuk menyelesaikan masalah ini, kita boleh menggunakan model IO yang tidak menyekat, dan model pengaturcaraan EventLoop ialah cara untuk melaksanakan IO yang tidak menyekat.
I. Pengenalan kepada EventLoop
EventLoop ialah rangka kerja gelung peristiwa yang mengendalikan I/O dengan acara undian seperti deskriptor fail atau isyarat. Ia adalah model tak segerak berdasarkan pencetusan peristiwa. Dalam EventLoop, semua acara tidak segerak Apabila peristiwa berlaku, EventLoop akan memanggil fungsi panggil balik yang sepadan untuk mengendalikannya.
Dalam PHP, EventLoop bergantung terutamanya pada sambungan libevent ialah perpustakaan pemberitahuan acara yang menyediakan antara muka bersatu untuk mengendalikan acara asas pada platform yang berbeza.
II. Model Pengaturcaraan EventLoop
EventLoop biasanya terdiri daripada tiga bahagian:
Dalam EventLoop, kami memerlukan Daftar semua acara yang perlu diuruskan. Berikut ialah kod sampel mudah:
$eventBase = event_base_new(); //创建event base $fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket event_set($event, $fd, EV_READ | EV_PERSIST, 'accept_conn', $eventBase); //注册事件 event_base_set($event, $eventBase); //将事件与event base关联 event_add($event); //添加事件
Dalam contoh ini, kita mula-mula mencipta pangkalan peristiwa, dan kemudian menggunakan fungsi socket_create untuk mencipta deskriptor soket. Seterusnya, kami menggunakan fungsi event_set untuk mendaftarkan deskriptor soket sebagai acara yang boleh dibaca dan menentukan fungsi panggil balik accept_conn untuk mengendalikannya.
Mengendalikan acara ialah bahagian teras EventLoop dan kunci untuk melaksanakan panggilan tak segerak.
Dalam EventLoop, kita perlu menggunakan fungsi event_base_loop untuk memulakan gelung peristiwa Apabila peristiwa berlaku, EventLoop akan memanggil fungsi panggil balik yang sepadan untuk memproses acara. Berikut ialah kod contoh mudah:
function accept_conn($fd, $events, $arg) { $conn = socket_accept($fd); //接收客户端连接 $buf = socket_read($conn, 1024); //读取客户端请求 socket_write($conn, 'Hello World!'); //向客户端发送响应 socket_close($conn) //关闭连接 } $eventBase = event_base_new(); //创建event base $fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket event_set($event, $fd, EV_READ | EV_PERSIST, 'accept_conn', $eventBase); //注册事件 event_base_set($event, $eventBase); //将事件与event base关联 event_add($event); //添加事件 event_base_loop($eventBase); //启动事件循环
Dalam contoh ini, kami mula-mula mentakrifkan fungsi panggil balik accept_conn untuk mengendalikan deskriptor soket yang digunakan untuk mendengar sambungan klien. Apabila deskriptor soket pendengaran boleh dibaca, EventLoop akan memanggil fungsi panggil balik accept_conn untuk mengendalikan acara.
Dalam fungsi panggil balik accept_conn, kami mula-mula menggunakan fungsi socket_accept untuk menerima sambungan klien, kemudian membaca permintaan klien, menghantar respons kepada klien, dan akhirnya menutup sambungan.
Akhir sekali, kita perlu menggunakan fungsi event_del untuk mengalih keluar acara daripada pangkalan acara, dan menggunakan fungsi event_free untuk melepaskan sumber yang diduduki oleh peristiwa. Berikut ialah kod sampel ringkas:
event_del($event); //从event base中移除事件 event_free($event); //释放事件所占用的资源 event_base_free($eventBase); //释放event base所占用的资源
Dalam contoh ini, kami menggunakan fungsi event_del untuk mengalih keluar acara daripada pangkalan acara, menggunakan fungsi event_free untuk melepaskan sumber yang diduduki oleh acara dan akhirnya menggunakan fungsi event_base_free untuk melepaskan sumber asas acara yang diduduki.
III. Ringkasan
Model pengaturcaraan EventLoop ialah model pengaturcaraan tak segerak berdasarkan dipacu peristiwa, yang boleh mencapai IO tanpa sekatan yang cekap dan meningkatkan prestasi dan daya pemprosesan pelayan. Dalam PHP, kita boleh menggunakan sambungan libevent untuk melaksanakan model pengaturcaraan EventLoop.
Atas ialah kandungan terperinci Bermula dengan PHP: Model Pengaturcaraan EventLoop. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!