Rumah  >  Artikel  >  pembangunan bahagian belakang  >  PHP menggunakan Socket dan EPOLL untuk menghantar dan menerima mesej dalam sistem pemesejan segera dalam talian

PHP menggunakan Socket dan EPOLL untuk menghantar dan menerima mesej dalam sistem pemesejan segera dalam talian

WBOY
WBOYasal
2023-05-24 10:31:351271semak imbas

Dengan perkembangan Internet yang berterusan, sistem pemesejan segera (IM) telah menjadi alat yang sangat diperlukan dalam kehidupan dan pekerjaan orang ramai. Antaranya, cara memastikan penghantaran pantas dan prestasi masa nyata mesej telah menjadi bahagian penting dalam reka bentuk sistem. Artikel ini akan memperkenalkan cara menggunakan Soket PHP dan EPOLL untuk menghantar dan menerima mesej dalam sistem pemesejan segera dalam talian.

1. Gambaran Keseluruhan Socket
Soket, atau soket, ialah cara berkomunikasi antara komputer Ia pada asalnya dibangunkan oleh BSD (Berkeley Software Distribution), sebuah syarikat permulaan AT&T Bell Labs salah satu teknologi yang mesti dikuasai dalam pengaturcaraan rangkaian. Melalui teknologi Soket, aplikasi boleh menggunakan protokol TCP/IP untuk komunikasi rangkaian bagi merealisasikan penghantaran dan penerimaan data.

2. Gambaran Keseluruhan EPOLL
EPOLL ialah mekanisme pemultipleksan I/O yang disediakan oleh kernel Linux. Dalam mekanisme pilih dan tinjauan tradisional, keseluruhan jadual deskriptor fail perlu dilalui untuk setiap operasi baca dan tulis, yang tidak cekap. EPOLL mengguna pakai kaedah mendaftarkan fungsi panggil balik, yang hanya beroperasi apabila data sedia Sebagai perbandingan, ia boleh meningkatkan keselarasan dan prestasi sistem.

3. Laksanakan sistem IM menggunakan Socket dan EPOLL dalam PHP
1 Program pelayan
Dalam program pelayan, anda boleh menggunakan fungsi socket_create() untuk mencipta sumber soket_bind(. ) fungsi mengikat nama hos atau alamat IP dan nombor port untuk mengaitkan soket dengan alamat setempat. Seterusnya, panggil fungsi socket_listen() untuk menunggu klien menyambung. Apabila terdapat permintaan sambungan, fungsi socket_accept() dipanggil untuk menerima sambungan. Pada ketika ini, sambungan baharu harus ditambahkan pada senarai tugas.

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket,"0.0.0.0", 8888);
socket_listen($socket);

while(true){

$epoll_events = epoll_wait($epoll, $events, $timeout);
foreach($events as $event){
    if($event['resource'] == $socket){
        $client = socket_accept($socket);
        $client_id = uniqid();
        $client_list[$client_id] = array(
            'socket' => $client,
            'buffer' => '',
        );
        $fd = socket_import_stream($client);
        stream_set_blocking($client, false);
        $event = stream_socket_create($fd, -1);
        stream_set_blocking($event, 0);
        epoll_ctl($epoll, EPOLL_CTL_ADD, $fd, EPOLLIN);
    }

2. Terima mesej
Cipta objek epoll apabila program bermula, dan kemudian tambahkan soket pelayan pada senarai acaranya. Selepas sambungan baharu diterima, ia boleh ditukar kepada deskriptor fail menggunakan stream_socket_create() dan kemudian ditambahkan pada senarai acara objek epoll. Dan dalam setiap gelung mendengar acara, gunakan fungsi socket_recv() untuk menerima mesej dan menyimpannya dalam senarai tugas.

if($event['events'] & EPOLLIN){

if($event['resource'] == $socket){
    $client = socket_accept($socket);
    $client_id = uniqid();
    $client_list[$client_id] = array(
        'socket' => $client,
        'buffer' => '',
    );
    $fd = socket_import_stream($client);
    stream_set_blocking($client, false);
    $event = stream_socket_create($fd, -1);
    stream_set_blocking($event, 0);
    epoll_ctl($epoll, EPOLL_CTL_ADD, $fd, EPOLLIN);
} else {
    $fd = intval($event['fd']);
    $client_id = array_search($fd, array_column($client_list, 'socket'));
    $buffer = '';
    while(socket_recv($event['resource'], $recv, 1024, MSG_DONTWAIT)){
        $buffer .= $recv;
    }
    $client_list[$client_id]['buffer'] .= $buffer;
}

}

3 Hantar mesej
Selepas menerima mesej, anda boleh menggunakan socket_write(. ) Hantar data respons kepada pelanggan.

fungsi send_message($client_id, $message){

global $client_list;
if(isset($client_list[$client_id])){
    $message .= "

";

    socket_write($client_list[$client_id]['socket'], $message, strlen($message));
}

}

IV. Ringkasan
Dengan menggunakan Soket PHP dan Dengan teknologi EPOLL, kami hanya boleh menghantar dan menerima mesej dalam sistem IM, yang sangat meningkatkan keselarasan dan prestasi sistem Pada masa yang sama, apabila mereka bentuk sistem IM, kami juga perlu mempertimbangkan banyak aspek seperti keselamatan dan data kebolehpercayaan penghantaran . Oleh itu, dalam aplikasi praktikal, ia perlu disesuaikan dan dioptimumkan mengikut keperluan khusus

Atas ialah kandungan terperinci PHP menggunakan Socket dan EPOLL untuk menghantar dan menerima mesej dalam sistem pemesejan segera dalam talian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn