လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> အဘယ်ကြောင့် Socket_accept () ပိတ်ဆို့ခြင်းသည်အဘယ်ကြောင့်တားဆီး? ဤပြ problem နာကိုပိတ်ဆို့ခြင်းနှင့်ဖြေရှင်းခြင်းမှရှောင်ရှားရန် Socket_select () ကိုမည်သို့အသုံးပြုရမည်နည်း။

အဘယ်ကြောင့် Socket_accept () ပိတ်ဆို့ခြင်းသည်အဘယ်ကြောင့်တားဆီး? ဤပြ problem နာကိုပိတ်ဆို့ခြင်းနှင့်ဖြေရှင်းခြင်းမှရှောင်ရှားရန် Socket_select () ကိုမည်သို့အသုံးပြုရမည်နည်း။

M66 2025-06-12

Socket Programming အတွက် PHP ကိုအသုံးပြုသောအခါ developer များစွာသည် Socket_Accept () နှင့် ပထမဆုံးထိတွေ့သောအခါပြ a နာတစ်ခုနှင့်ကြုံတွေ့ရသည်။ ၎င်းသည်အချို့သောအခြေအနေများတွင်တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းသို့မဟုတ်ဆက်သွယ်မှုများစွာကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်သောဖြစ်နိုင်ချေရှိသောအခြေအနေများတွင်ပိတ်ဆို့မှုတစ်ခုဖြစ်လာနိုင်သည်။

ဒီတော့ဘာကြောင့်ဒီလိုဖြစ်ရတာလဲ။ ဤပြ problem နာကိုပိတ်ဆို့ခြင်းနှင့်မဖြေရှင်းနိုင်ရန် socket_select () ကို ကျွန်ုပ်တို့မည်သို့အသုံးပြုနိုင်မည်နည်း။

1 ။ အဘယ်ကြောင့် socket_accept () ပိတ်ပင်တားဆီးမှုကဘာလဲ?

Socket_Accept () သည်နားထောင်နေသည့် socket မှဆက်သွယ်မှုတောင်းဆိုမှုကိုလက်ခံရန်အသုံးပြုသော function တစ်ခုဖြစ်သည်။ ရှေ့ပြေးပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -

 resource socket_accept(resource $socket);

ဤလုပ်ဆောင်မှု၏အနှစ်သာရမှာ - client connection မရှိပါသည့်အခါ၎င်းသည်ဆက်သွယ်မှုမရောက်မချင်းပရိုဂရမ်ကွပ်မျက်မှုကိုပိတ်ဆို့ထားသည် ။ ဒါကငါ / o အပြုအမူကိုပိတ်ဆို့ခြင်းဖြစ်ပါတယ်။

ဤအပြုအမူသည် single-threaded server များအတွက်မနှစ်သက်ပါ။ အကယ်. ဆာဗာသည်ဆက်သွယ်မှုကိုစောင့်နေသည့်အတွက်အခြားအလုပ်များသည်လုံးဝမအောင်မြင်ပါ။

2 ။ ပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန် Socket_select () ကို မည်သို့အသုံးပြုရမည်နည်း။

ဤပြ problem နာကိုဖြေရှင်းရန် PHP သည် socket_select () function ကိုထောက်ပံ့ပေးနိုင်သည့် Socket () function ကိုထောက်ပံ့ပေးနိုင်သည်။ မည်သည့် sockets ကိုဖတ်ခြင်း / ရေးခြင်းလုပ်ငန်းများအတွက်အဆင်သင့်ဖြစ်နေသည်။

Socket_select ၏အခြေခံအသုံးပြုမှု ()

 int socket_select(
    array &$read,
    array &$write,
    array &$except,
    int $tv_sec,
    int $tv_usec = 0
);

သင်နားထောင်ချင်သော societ ကို ဒေါ်လာဖတ်ရန် နှင့် Call Societ_select () () သို့သင်၌ထားရန်လိုအပ်သည်။ Socket ကိုဖတ်လို့ရတဲ့အခါ (I.E. client convertony quertion တောင်းဆိုမှုတစ်ခုရှိရင်) socket_eselect () ပြန်လာ လိမ့်မယ်,

နမူနာကုဒ်

Socket_select () သုံး. socient_select () ကို အသုံးပြု. sociec_se-side signe server-side signer တစ်ခုရှိသည်။

 <?php
set_time_limit(0);

// ဖန်တီး socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

// Non-blocking mode ကိုသတ်မှတ်ပါ(မလုပ်မနေရမဟုတ်သော,အကြံပြုပါသည်)
socket_set_nonblock($server);

$clients = [];

while (true) {
    $read_sockets = [$server] + $clients;
    $write = $except = [];

    // အားလုံးနားထောင်ပါ sockets,အချိန်ကုန် 1 စက်ဏန့်
    $changed = socket_select($read_sockets, $write, $except, 1);

    if ($changed === false) {
        echo "socket_select() အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
        break;
    }

    // ဆက်သွယ်မှုအသစ်တစ်ခုရှိသည်
    if (in_array($server, $read_sockets)) {
        $client = socket_accept($server);
        if ($client !== false) {
            socket_getpeername($client, $ip, $port);
            echo "ဆက်သွယ်မှုအသစ် {$ip}:{$port}\n";
            $clients[] = $client;
        }
        // မှ read နားထောင်သူကိုစာရင်းမှဖယ်ရှားပါ socket
        $key = array_search($server, $read_sockets);
        unset($read_sockets[$key]);
    }

    // ချိတ်ဆက်ထားပြီးသောလုပ်ငန်းစဉ်ဒေတာ
    foreach ($read_sockets as $sock) {
        $data = @socket_read($sock, 1024, PHP_NORMAL_READ);
        if ($data === false || trim($data) === '') {
            // client ကို disconnection
            $key = array_search($sock, $clients);
            unset($clients[$key]);
            socket_close($sock);
            continue;
        }

        $data = trim($data);
        echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်:{$data}\n";

        $response = "မင်းဒါကိုပို့လိုက်တယ်:{$data}\n";
        socket_write($sock, $response);
    }
}
socket_close($server);

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

  • Socket_Accept () သည်ပိတ်ဆို့ခြင်းဖြစ်ပြီးရိုးရှင်းသော,

  • တစ်ပြိုင်နက်တည်းပံ့ပိုးသောဆာဗာတစ်ခုတည်ဆောက်ရန် socket_select () ကို Socket ၏ stature ကိုနားထောင်ရန်အသုံးပြုသင့်သည်။

  • Socket_select () သည် socket မျိုးစုံအပေါ် "စောင့်ဆိုင်း" ဖြစ်ရပ်များကို "စောင့်ဆိုင်း" စေရန်ခွင့်ပြုသည်။

  • ပြောင်းလွယ်ပြင်လွယ်တိုးတက်စေရန် socket_set_set_nonblock () နှင့် တွဲဖက်. အသုံးပြုရန်အကြံပြုသည်။

အထက်ပါနည်းလမ်းများမှတစ်ဆင့်သင်ဟာ Client Connections မျိုးစုံကိုတစ်ချိန်တည်းမှာကိုင်တွယ်နိုင်တဲ့တုန့်ပြန် PHP Socket Server ကိုအကောင်အထည်ဖော်နိုင်ပြီးပိုပြီးရှုပ်ထွေးတဲ့ကွန်ယက်ပရိုဂရမ်အတွက်အခြေခံအုတ်မြစ်ချခြင်း။

အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်ဒိုမိန်းအမည်သို့မဟုတ်လိပ်စာကိုကိုယ်ပိုင် 0 န်ဆောင်မှုလိပ်စာဖြင့်အစားထိုးသည်။