လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP Network Programming တွင် Socket_select ၏လက်တွေ့ကျသောအသုံးချခြင်း

PHP Network Programming တွင် Socket_select ၏လက်တွေ့ကျသောအသုံးချခြင်း

gitbox 2025-05-28

PHP Network Programming တွင် Socket_select function သည် Multiplexing ကိုအကောင်အထည်ဖော်ရန်အတွက်အဓိကကိရိယာတစ်ခုဖြစ်သည် (i / o မြှောက်ခြင်း) ။ ၎င်းသည်ပရိုဂရမ်ကိုတစ်ချိန်တည်းတွင် Socket မျိုးစုံနားထောင်ရန်ခွင့်ပြုသည်, မည်သည့် sockets ကိုဖတ်နိုင်သည်, ဤဆောင်းပါးသည် PHP Network Programming တွင် Socket_select နှင့်၎င်း၏လျှောက်လွှာကိုရှင်းပြရန်လက်တွေ့ကျမှုများကိုပေါင်းစပ်ပါလိမ့်မည်။


1 ။ socket_select ၏အခြေခံမူများနှင့်လုပ်ဆောင်ချက်များကို

Socket_select ကို socket အရင်းအမြစ်များအစုတခုကိုစောင့်ကြည့်လေ့လာပြီးဖတ်ရန်နှင့်စစ်ဆင်ရေးများအတွက်မည်သည့် sockets ကိုအဆင်သင့်ဖြစ်နေသည်ကိုဆုံးဖြတ်ရန်အသုံးပြုသည်။ ရှေ့ပြေးပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -

 int socket_select(array &$read, array &$write, array &$except, ?int $tv_sec, ?int $tv_usec = null)
  • $ ဖတ်ရန် - ဖတ်လို့မရသောစာရင်းကိုနားထောင်ပါ။

  • $ ရေးရန် - ၎င်း,

  • $ မှလွဲ ။ - ခြွင်းချက်များကိုနားထောင်သည့် Socket Array

  • $ tv_sec နှင့် $ tv_usec : အချိန်ကုန် (စက္ကန့်နှင့် microseconds)

အနည်းဆုံး socket တစ်ခုအဆင်သင့်ဖြစ်သည်အထိ function ကိုလုပ်ကွက်များသို့မဟုတ်အချိန်ကုန်တစ်ခုဖြစ်သော,


2 ။ Socket_select ၏အခန်းကဏ်။ အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုအတွက်

အမှန်တကယ်ဆာဗာဖွံ့ဖြိုးတိုးတက်မှုတွင်ဖောက်သည်များဆက်သွယ်မှုမျိုးစုံသည်တစ်ချိန်တည်းရောက်ရှိသည့်အခြေအနေကိုကျွန်ုပ်တို့မကြာခဏရင်ဆိုင်လေ့ရှိသည်။ ပိတ်ဆို့ခြင်း socket_accept_accept_Accept ကို အသုံးပြုခြင်းသည်တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုမျိုးစုံကိုတစ်ချိန်တည်းတွင်မကိုင်တွယ်နိုင်ပါ။ Socket_select မှတဆင့်ကျွန်ုပ်တို့လုပ်နိုင်သည် -

  • တစ်ပြိုင်နက်တည်း client connections မျိုးစုံကိုနားထောင်ပါ

  • Socket တွင်အချက်အလက်များရှိသည့်အချိန်တွင်အချက်အလက်များကိုအချိန်တိုအတွင်းဖတ်ပါ, ၎င်းသည်ပျင်းရိသောအခါ CPU ကိုပိတ်ဆို့မည်မဟုတ်ပါ

  • ထိရောက်သောဖြစ်ရပ် - မောင်းနှင်မော်ဒယ်ကိုအကောင်အထည်ဖော်


3 ။ PHP Network Programming လက်တွေ့အမှုကို - client clash chat chat room server

အောက်ပါဥပမာသည် client connections မျိုးစုံကိုအထောက်အကူပြုသောရိုးရှင်းသော chat room server ကိုအကောင်အထည်ဖော်ရန်နှင့်လူတိုင်းထံသို့စာများထုတ်လွှင့်သည်။

 <?php
// ဖန်တီးTCP Socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, "0.0.0.0", 12345);
socket_listen($server);

$clients = [];
echo "chat room server startup chat,ဆိပ်ကမ်းကိုနားထောင်ပါ12345...\n";

while (true) {
    // နားထောင်ခြင်းခင်းကျင်းမှုကိုတည်ဆောက်ပါ,ဆာဗာအပါအ 0 င်socketနှင့်အားလုံးဖောက်သည်များsocket
    $readSockets = $clients;
    $readSockets[] = $server;

    // အသုံးပြုsocket_selectReadability ကိုစောင့်ပါsocket
    $write = $except = null;
    $numChangedSockets = socket_select($readSockets, $write, $except, 0, 200000);

    if ($numChangedSockets === false) {
        echo "socket_select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
        break;
    } elseif ($numChangedSockets > 0) {
        // ဆက်သွယ်မှုအသစ်ကိုနားထောင်ပါ
        if (in_array($server, $readSockets)) {
            $newClient = socket_accept($server);
            if ($newClient !== false) {
                $clients[] = $newClient;
                $welcomeMsg = "ချက်တင်ခန်းမှကြိုဆိုပါသည်!\n";
                socket_write($newClient, $welcomeMsg, strlen($welcomeMsg));
                echo "ဖောက်သည်အသစ်သို့ဆက်သွယ်ပါ,လက်ရှိဆက်သွယ်မှုနံပါတ်:" . count($clients) . "\n";
            }
            // မှreadSocketsဖယ်ရှားခဲ့သည်server socket,ထပ်ခါတလဲလဲအပြောင်းအလဲနဲ့တားဆီး
            $key = array_search($server, $readSockets);
            unset($readSockets[$key]);
        }

        // client ကိုမှပေးပို့သောလုပ်ငန်းစဉ်များ
        foreach ($readSockets as $sock) {
            $data = @socket_read($sock, 2048, PHP_NORMAL_READ);
            if ($data === false || $data === '') {
                // client ကို connection ကိုပိတ်လိုက်
                $key = array_search($sock, $clients);
                socket_close($sock);
                unset($clients[$key]);
                echo "client ကို disconnection,လက်ရှိဆက်သွယ်မှုနံပါတ်:" . count($clients) . "\n";
                continue;
            }
            $data = trim($data);
            if ($data) {
                echo "မက်ဆေ့ခ်ျကိုလက်ခံရရှိခဲ့သည်: $data\n";
                // ဖောက်သည်များအားလုံးကိုထုတ်လွှင့်သောစာများ
                foreach ($clients as $client) {
                    if ($client != $sock) {
                        socket_write($client, "အသုံးပြုသူတစ် ဦး ကဆိုပါတယ်: $data\n");
                    }
                }
            }
        }
    }
}
socket_close($server);

4 ။ ကုဒ်ခွဲခြမ်းစိတ်ဖြာခြင်း

  • ဆာဗာသည် TCP Socket ကိုပထမဆုံးဖန်တီးပေးပြီးဆိပ်ကမ်းကိုချည်နှောင်ထားပြီးဆက်သွယ်မှုအတွက်နားထောင်သည်။

  • အဓိကကွင်းဆက်တွင် ဒေါ်လာ Readsockets တွင် client sockets နှင့် server နားထောင်ခြင်း Sockets ပါ 0 င်သည်။

  • မည်သည့် socket ကိုဖတ်ရန်မဆို socket_select ကို Socket_select

  • server socket ကိုဖတ်လို့ရပါဆိုရင် client စာရင်းကိုလက်ခံပြီးလက်ခံပြီး 0 န်ဆောင်မှုပေးသည်။

  • client socket ကိုဖတ်လို့ရပါကအချက်အလက်များကိုဖတ်ရန်အချက်အလက်များကိုဖတ်ပါ။ သို့ဆိုလျှင်ဆက်သွယ်မှုကိုပိတ်လိုက်သည်။

  • CPU idling ကိုရှောင်ရှားရန် 0.2 စက္ကန့်ကို 0.2 စက္ကန့်ကြာအောင်မပိတ်ပါနှင့်။


5 ။ အကျဉ်းချုပ်

  • Socket_select သည် connection multi-connection multiplexing အတွက်သော့ချက်ဖြစ်သည်, ဆာဗာစွမ်းဆောင်ရည်ကိုပိတ်ဆို့ခြင်းနှင့်တိုးတက်အောင်ပြုလုပ်ခြင်းကိုရှောင်ရှားရန်ဖြစ်သည်။

  • Multi-client ကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုကို socket_select သုံး. အလွယ်တကူအကောင်အထည်ဖော်နိုင်သည်။

  • chat rooms, အွန်လိုင်းဂိမ်းများ, လက်ငင်းစာတိုပေးပို့ရေးနှင့်အခြား network application scerparios များအတွက်သင့်တော်သည်။


အကယ်. သင်သည်အသေးစိတ်သင်ခန်းစာများနှင့်အမှုများပိုမိုသိလိုပါက PHP Network Programming နှင့် ပတ်သက်. သင်ခန်းစာများကိုသင်ကြည့်ရှုလိုပါက http://gitbox.net/php-network-tuterial