လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ပိတ်ဆို့ခြင်းမဟုတ်သောနားထောင်ခြင်းအတွက် socket_set_block status ကိုယာယီ switching လုပ်နည်း

ပိတ်ဆို့ခြင်းမဟုတ်သောနားထောင်ခြင်းအတွက် socket_set_block status ကိုယာယီ switching လုပ်နည်း

gitbox 2025-05-26

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

ကံကောင်းထောက်မစွာပင် PHP သည် fockset_set_block () နှင့် socket_set_set_set_set_set_set_nonblock ()) ကိုထောက်ပံ့ပေးသည်။

ဤဆောင်းပါးသည် TCP ဆာဗာပုံနမူနာကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောအခြေအနေကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောအခြေအနေကိုပိတ်ဆို့ခြင်းနှင့်ပြန်လည်ထူထောင်ခြင်းမပြုပါနှင့်။

နမူနာမြင်ကွင်း

ကျွန်ုပ်တို့သည်ပိတ်ဆို့ခြင်းမဟုတ်သော TCP server ကိုကျွန်ုပ်တို့တည်ဆောက်သည်။ client connection ကိုနားထောင်ပြီး client connection ကို blocking mode သို့ 0 င်ရောက်ခြင်းကိုယာယီဖွင့်ပြီးပြီးစီးပြီးနောက်ပိတ်ဆို့ခြင်းမရှိသော mode ကိုဖတ်ပါ။

ဤတွင်ပြီးပြည့်စုံသောကုဒ်ဖြစ်သည်။

<Code> <? PHP

$ host = '0.0.0.0';
$ port = 12345;

// Socket ကိုဖန်တီးပါ
$ server = Socket_create (AF_INT, sock_stream, sol_tcp);
Socket_set_option ($ server, sol_socket, so_reuseaddr, 1);

// binding နှင့်နားထောင်ခြင်း
Socket_bind ($ server, $ host, $ port);
Socket_listen ($ ဆာဗာ);

// Non- ပိတ်ဆို့ခြင်းမှသတ်မှတ်ထား
Socket_set_nonBlock ($ ဆာဗာ);

ECHO "ဆာဗာကို {$ host}: {$ host}: {$ port} ... \ n";

$ client များ = [];

နေစဉ် (စစ်မှန်တဲ့) {
// connection ကိုလက်ခံခြင်း (ပိတ်ဆို့ခြင်းမဟုတ်)
$ client = @socket_acceCcept ($ ဆာဗာ);
လျှင် ($ client! == fiss) လျှင်
ECHO "client အသစ်ချိတ်ဆက်ထားသည်။ \ n";
// client ကိုစာရင်းထဲသို့ထည့်ပါ
$ client များ [] = $ client;

     // client ကိုပိတ်ဆို့ခြင်းမှ client ကိုသတ်မှတ်ပါ
    socket_set_nonblock($client);
}

foreach ($clients as $index => $sock) {
    $buffer = '';

    // အပြည့်အဝဖတ်ရန်သေချာစေရန်ပိတ်ဆို့ရန်ယာယီ(ဥပမာအားဖြင့်, သတ်မှတ်ထားသောအရှည်အရှည်သို့မဟုတ်အလံတစ်အလွှာကိုဖတ်ပါ)
    socket_set_block($sock);

    $bytes = @socket_recv($sock, $buffer, 1024, MSG_DONTWAIT);

    // Non- ပိတ်ဆို့ခြင်းမှပြန်ပြောင်း
    socket_set_nonblock($sock);

    if ($bytes === false || $bytes === 0) {
        // client ကိုအဆက်ပြတ်
        echo "Client disconnected.\n";
        socket_close($sock);
        unset($clients[$index]);
        continue;
    }

    // output ကိုဒေတာကိုဖတ်ပါ
    echo "Received: " . trim($buffer) . "\n";

    // နမူနာတုံ့ပြန်မှု
    $response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from server!\n";
    socket_write($sock, $response);
}

// အနည်းငယ်နှောင့်နှေးရှောင်ရှားခြင်း CPU ပြည့်သော
usleep(100000);

}

Socket_Close ($ ဆာဗာ);
>
</ code>

ဇာတ်လမ်းဖော်ပြချက်ကိုသုံးပါ

အထက်ပါကုဒ်များတွင်ကျွန်ုပ်တို့၏နားထောင်ခြင်း socket ($ server) သည်ပိတ်ဆို့ခြင်းမဟုတ်ဘဲ socket_accept () တွင်ပိတ်ဆို့ခြင်းမရှိပါ။ ဆက်သွယ်မှုအသစ်ကိုလက်ခံသည့်အခါတိုင်း client အသစ်ကိုပိတ်ဆို့ခြင်းကိုမပြုလုပ်နိုင်ပါ။ သို့သော်ကျွန်ုပ်တို့သည်လက်ခံသောအချက်အလက်များကိုကျွန်ုပ်တို့လုပ်ဆောင်သောနေရာတွင် 0 န်ဆောင်မှုကိုပိတ်ဆို့ခြင်းကိုတက်ကြွစွာပိတ်ထားသည်

၎င်းသည်အလွန်အသုံးများသောအသုံးပြုမှုနည်းလမ်းတစ်ခုဖြစ်ပြီး, ဥပမာအများအပြားတွင်အထူးအရေးကြီးသည် (Protocol Handshake Phase ကဲ့သို့သော) တွင်အထူးအရေးကြီးသည်။ ဥပမာအားဖြင့်, သင်သည် client ကိုပထမ ဦး ဆုံးအကြိမ်သတ်မှတ်ထားသော header အချက်အလက်များပါ 0 င်ရမည်ဟုဖော်ပြသည်။ ဤအချိန်တွင်ပိတ်ဆို့ခြင်းစာဖတ်ခြင်းကိုအသုံးပြုခြင်းသည်အလွန်အဓိပ္ပါယ်ရှိသောဖြစ်လာသည်။

မှတ်သားရန်အရာ

  • Modes ကိုပြောင်းခြင်းကို switching လုပ်သည့်အခါသတိထားပါ - ပိတ်ဆို့ခြင်းမဟုတ်သောစာဖတ်ခြင်းကိုခေတ္တပိတ်ထားခြင်းဖြင့် "အတင်းအဓမ္မစစ်ဆေးရန်" နည်းလမ်းဖြစ်သည်။ အဆင်ပြေသော်လည်း 0 န်ဆောင်မှုခံယူသူသည်မည်သည့်ဒေတာကိုမဆိုမပို့ပါကဆာဗာသည်ကပ်နေလိမ့်မည်။ ၎င်းသည်အချိန်ကုန်ယန္တရားသို့မဟုတ်ကြိုတင်သတ်မှတ်ထားသောဒေတာအရှည်နှင့်ကိုက်ညီရန်အကြံပြုသည်။

  • ရေတိုပိတ်ဆို့ခြင်းအတွက်သင့်တော်သည် ။ ဤအမျိုးအစားပြောင်းလဲမှုသည်အချို့သောစစ်ဆင်ရေးများကိုပိတ်ဆို့ထားရမည့်အခြေအနေများအတွက်သင့်တော်ပြီးဆက်သွယ်ရေးလုပ်ငန်းစဉ်တစ်လျှောက်ပိတ်ဆို့ခြင်းကိုအသုံးပြုရန်မလိုအပ်ပါ။

ကောက်ချက်

Use socket_set_block() and socket_set_nonblock() to make your PHP socket programming more flexible. လုပ်ဆောင်ခြင်းယုတ္တိဗေဒအရသင့်လျော်သောပိတ်ဆို့ခြင်း mode ကိုရွေးချယ်နိုင်သည်။

နောက်ထပ် Socket Programming အလေ့အကျင့်များနှင့်ဥပမာများပိုမိုများပြားရန်အတွက်စာရွက်စာတမ်းများကိုဖတ်ရှုပါသို့မဟုတ်ကျွန်ုပ်တို့၏အရင်းအမြစ်ပလက်ဖောင်းကိုသွားပါ။

https://gitbox.net/php-socket-Guide