Rumah >pembangunan bahagian belakang >tutorial php >Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web

Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web

藏色散人
藏色散人ke hadapan
2023-02-02 13:43:364044semak imbas

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.

Pemultipleksan IO soket asli PHP dan pelaksanaan pelayan web

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

Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web

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:

  • Berbilang proses, iaitu. ialah, pelbagai proses dimulakan pada pelayan untuk memantau

  • mekanisme pemultipleksan IO, yang hanya melaksanakan penggunaan pelanggan N Satu kabel rangkaian mengakses secara serentak

. Pemultipleksan serentak dibahagikan kepada dua model berbeza, iaitu

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

Sintaks

Dalam artikel sebelumnya, kami memperkenalkan. soket asli php Fungsi

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|false
Parameter

  • read

    Pelayan Apabila sumber soket yang dipantau berubah (iaitu, mesej baharu diterima atau pelanggan disambungkan atau diputuskan sambungan), fungsi

    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

    memantau sama ada pelanggan menulis data dengan menghantar

    bermakna ia tidak peduli sama ada terdapat perubahan tulis null

    .
  • except

    Elemen yang akan dikecualikan dalam soket,

    yang masuk adalah "mendengar" Semuanull

  • seconds

    Saat dan mikrosaat bersama-sama membentuk parameter tamat masa. Jika

    diluluskan, ia akan menyekat, iaitu 0 dan tidak menyekat Jika >0, ia akan menjadi masa penyekatan maksimum null

  • microseconds

Pengoptimuman

Dalam

artikel lepas kami hanya melaksanakan sambungan antara pemantauan pelayan soket dan klien Seterusnya, kami mengoptimumkan kod melalui pemultipleksan pada kod pemantauan pelayan :

<?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 &#39;请求ip: &#39; . $ip . &#39;端口: &#39; . $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

Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web

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 == &#39;&#39;) return;

            $output = &#39;<h1>this is php worker</h1>&#39;;
            $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

Pemultipleksan IO siri PHP+Socket dan pelaksanaan pelayan web

. Pada masa yang sama, pelayan akan mengeluarkan kandungan berikut:

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.0
Kandungan 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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam