Rumah >pembangunan bahagian belakang >tutorial php >Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web
Artikel ini membawakan anda pengetahuan yang berkaitan tentang php+socket, yang terutamanya memperkenalkan pemultipleksan IO dan bagaimana php+socket melaksanakan pelayan web? Rakan-rakan yang berminat boleh lihat di bawah ini semoga bermanfaat untuk semua.
Penmultipleksan
Artikel sebelumnya Pelayan mudah -komunikasi pelanggan dilaksanakan melalui soket asli Walau bagaimanapun, apabila berbilang pelanggan disambungkan, pelayan hanya boleh mengendalikan permintaan pelanggan pertama dan tidak boleh melayani pelanggan berikutnya
Sebabnya. untuk situasi ini adalah kerana model IO menyekat dan hanya boleh diakses oleh satu pelanggan pada masa yang sama Terdapat dua penyelesaian utama untuk menyelesaikan masalah ini:
dan select
Dalam perisian biasa, epoll
digunakan model Apache
, select
menggunakan model nginx
. Terdapat model epoll
terbina dalam php, dan fungsi yang sepadan ialah select
Pemultipleks adalah asas untuk melaksanakan pelayan http socket_select
terbina dalam melaksanakan model socket_select
dan sintaksnya adalah seperti berikut: select
socket_select( array &$read, array &$write, array &$except, int $seconds [, int $microseconds = 0]): int|falseParameter
read
akan kembali (jika tidak, ia akan terus disekat), dan pada pada masa yang sama mengubah suai pembolehubah kepada peristiwa semasa (mesej diterima atau klien disambungkan atau diputuskan sambungan) senarai sumber soket, dan terus melaksanakan ke bawah. socket_select
write
bermakna ia tidak peduli sama ada terdapat perubahan tulis null
except
yang masuk adalah "mendengar" Semuanull
seconds
diluluskan, ia akan menyekat, iaitu 0 dan tidak menyekat Jika >0, ia akan menjadi masa penyekatan maksimum null
microseconds
<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置 ip 被释放后立即可使用 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true); // 绑定ip与端口 socket_bind($socket, 0, 8888); // 开始监听 socket_listen($socket); $sockets[] = $socket; while (true) { $tmp_sockets = $sockets; socket_select($tmp_sockets, $write, $except, null); foreach ($tmp_sockets as $sock) { // 如果当前套接字等于 socket_create 创建的套接字,说明是有新的连接或有新的断开连接 if ($sock == $socket) { $conn_sock = socket_accept($socket); $sockets[] = $conn_sock; socket_getpeername($conn_sock, $ip, $port); echo '请求ip: ' . $ip . '端口: ' . $port . PHP_EOL; } else { // 否则说明是之前连接的客户端发来消息 $msg = socket_read($sock, 10240); socket_write($sock, strtoupper($msg)); echo $msg; } } }Dalam contoh ini, fungsi
akan menyekat proses semasa apabila sumber soket dalam tatasusunan socket_select
mempunyai sambungan atau pemutusan sambungan atau penerimaan pelanggan mesej baharu, ia akan $tmp_sockets
Mengubah suai tatasusunan kepada sumber soket yang sedang aktif, dan kemudian memproses logik perniagaan dengan merentasi tatasusunan $tmp_sockets
Gunakan soket untuk laksanakan pelayan http mudah
Protokol http menentukan format data yang ditentukan berdasarkan soket, jadi kami hanya perlu menghantar data mengikut format apabila, dan penyemak imbas boleh bertindak balas kepada permintaan seperti biasa socket_write
<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置 ip 被释放后立即可使用 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true); // 绑定ip与端口 socket_bind($socket, 0, 8888); // 开始监听 socket_listen($socket); $sockets[] = $socket; while (true) { $tmp_sockets = $sockets; socket_select($tmp_sockets, $write, $except, null); foreach ($tmp_sockets as $sock) { if ($sock == $socket) { $conn_sock = socket_accept($socket); $sockets[] = $conn_sock; } else { $msg = socket_read($sock, 10240); var_dump($msg); if ($msg == '') return; $output = '<h1>this is php worker</h1>'; $len = strlen($output); $response = "HTTP/1.1 200 OK\r\n"; $response .= "content-type: text/html\r\n"; $response .= "server: php socket\r\n"; $response .= "Content-Length: {$len}\r\n\r\n"; $response .= $output; socket_write($sock, $response); } } }dalam perkhidmatan Jalankan contoh ini pada klien, dan kemudian akses
dalam penyemak imbas Anda boleh melihat yang berikut: ip:8888
GET / HTTP/1.1 Host: 124.222.**.**:8888 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: jenkins-timestamper-offset=-28800000; _ga=GA1.1.1403944751.1652010033; _ga_2GM6102E19=GS1.1.1652802985.7.1.1652803014.0Kandungan ini ialah data asal yang diminta oleh pengguna Data ini boleh dihuraikan dan dibalas mengikut permintaan Contohnya, gunakan
untuk membaca kandungan fail yang ditentukan dan mengembalikannya ke penyemak imbas file_get_content
Pembelajaran yang disyorkan: "Tutorial Video PHP》
Atas ialah kandungan terperinci Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!