လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> control flow နှင့်အတူ messaging system ကိုအကောင်အထည်ဖော်ရန် Socket_set_block ကိုသုံးပါ

control flow နှင့်အတူ messaging system ကိုအကောင်အထည်ဖော်ရန် Socket_set_block ကိုသုံးပါ

gitbox 2025-05-29

1 ။ socket_set_set_blocking ဆိုတာဘာလဲ။

PHP တွင် Socket_set_Set_Blocking function ကို Socket Resourt ၏ပိတ်ဆို့ခြင်း mode ကိုသတ်မှတ်ရန်အသုံးပြုသည်။

  • Blocking Mode: Socket-Related function များကိုခေါ်ဆိုသည့်အခါစစ်ဆင်ရေးပြီးစီးရန်စောင့်ဆိုင်းပါ။

  • ပိတ်ဆို့ခြင်းမဟုတ်သော mode: socket-related လုပ်ဆောင်ချက်များကိုခေါ်ဆိုသည့်အခါချက်ချင်းပြန်လာပြီးစစ်ဆင်ရေးပြီးစီးရန်မစောင့်ပါ။

ပုံမှန်အားဖြင့် Socket သည်ပိတ်ဆို့နေသည်။ Blocking mode သည်ရိုးရှင်းသောထပ်တူပြုခြင်းအခြေအနေများအတွက်သင့်တော်သော်လည်းစွမ်းဆောင်ရည်မြင့်မားသောဆာဗာများအတွက်ပိုမိုအသေးစိတ်ထိန်းချုပ်မှုစီးဆင်းမှုယန္တရားလိုအပ်သည်။

 bool socket_set_blocking ( resource $socket , bool $mode )
  • $ socket : socket အရင်းအမြစ်။

  • $ Mode : True ဆိုသည်မှာပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်း, မှားယွင်းသော နည်းလမ်းများသည်ပိတ်ဆို့ခြင်းမဟုတ်ကြောင်းဆိုလိုသည်။


2 ။ ထိန်းချုပ်မှုစီးဆင်းမှု၏အရေးပါမှု

ထိန်းချုပ်မှုစီးဆင်းမှုသည်မက်ဆေ့ခ်ျများလျင်မြန်စွာပေးပို့ခြင်းမှကာကွယ်ရန်မက်ဆေ့ခ်ျများကိုပေးပို့ခြင်းနှင့်လက်ခံခြင်းကိုကိုင်တွယ်ဖြေရှင်းခြင်း, ကွန်ယက်ပိတ်ဆို့ခြင်း, ထိန်းချုပ်မှုစီးဆင်းမှုရှိသောဒီဇိုင်းများသည်အောင်မြင်နိုင်သည်။

  • တန်းစီစာကြောင်းကြားခံ, တစ်ဆင့်ပြီးတစ်ဆင့်လိုက်ပို့ခြင်း။

  • ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော mode များအကြား dynamically switch ။

  • အချိန်ကုန်ကိုင်တွယ်ခြင်းနှင့်အမှားပြန်လည်ယန္တရား။


3 ။ ဒီဇိုင်းစိတ်ကူးများ

  • ဆာဗာနှင့် client နှစ်ခုလုံးသည်ပေးပို့ခြင်းနှင့်လက်ခံခြင်းကိုသေချာစေရန်ပိတ်ဆို့ခြင်း mode ကိုအသုံးပြုသည်။

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

  • ရေရှည်ဆွဲထားမှုကိုရှောင်ရှားရန်လက်ခံသူသည်ကျိုးကြောင်းဆီလျော်သောအချိန်ကုန်ကိုသတ်မှတ်သည်။

  • Multiplexing ကိုအောင်မြင်ရန် Socket_select ကို သုံးပါ။


4 ။ နမူနာကုဒ်

အောက်ဖော်ပြပါအချက်များသည် TCP-based php socient server ဥပမာတစ်ခုဖြစ်သည်

 <?php
$host = "0.0.0.0";
$port = 12345;

// ဖန်တီးsocket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $host, $port);
socket_listen($sock);

echo "Server started at $host:$port\n";

// စောင့်ကြည့်လေ့လာခြင်းကို set upsocketပိတ်ဆို့ mode ကို၌တည်၏,connection ကိုလက်ခံသည့်အခါ client ကိုစောင့်ဆိုင်း
socket_set_blocking($sock, true);

$clients = [];

while (true) {
    // အသုံးပြု socket_select တက်ကြွစွာဆက်သွယ်မှုကိုနားထောင်ပါ
    $read = $clients;
    $read[] = $sock; // မော်နီတာ joinsocket
    $write = [];
    $except = null;

    // လှုပ်ရှားမှုအတွက်စောင့်ဆိုင်းပိတ်ဆို့ခြင်းsocket
    if (socket_select($read, $write, $except, 5) < 1) {
        continue; // အချိန်အဘယ်သူမျှမလှုပ်ရှားမှု
    }

    // ဆက်သွယ်မှုအသစ်ဖြစ်စဉ်
    if (in_array($sock, $read)) {
        $newClient = socket_accept($sock);
        if ($newClient !== false) {
            socket_set_blocking($newClient, true); // client ကိုတက် settingsocketပိတ်ဆို့ခြင်းသည်,အာမခံအပြည့်အဝမက်ဆေ့ခ်ျကိုအာမခံ
            $clients[] = $newClient;
            echo "New client connected\n";
        }
        unset($read[array_search($sock, $read)]);
    }

    // ရှိပြီးသား 0 န်ဆောင်မှုခံယူသူများကို
    foreach ($read as $client) {
        $data = socket_read($client, 2048, PHP_NORMAL_READ);
        if ($data === false || $data === '') {
            // client ကို disconnection
            echo "Client disconnected\n";
            socket_close($client);
            unset($clients[array_search($client, $clients)]);
            continue;
        }
        $data = trim($data);
        echo "Received: $data\n";

        // ရိုးရှင်းသောပဲ့တင်သံ,စီးဆင်းမှုထိန်းချုပ်မှုနှင့်အတူ:မပို့ခင်သေချာအောင်လုပ်ပါsocketmode ကိုပိတ်ဆို့ခြင်း,ရေးမအောင်မြင်မှုကိုတားဆီး
        socket_set_blocking($client, true);
        $sendResult = socket_write($client, "Echo: $data\n");
        if ($sendResult === false) {
            echo "Failed to send message to client\n";
        }
    }
}

5 ။ parsing code အတွက်စီးဆင်းမှုဒီဇိုင်းအမှတ်

  • ပိတ်ဆို့ခြင်း mode ကိုပြောင်းလဲခြင်း <br> <br> နားထောင်ခြင်း socket နှင့် client socket နှစ်ခုစလုံးကိုပိတ်ဆို့ခြင်းကိုပိတ်ထားသည်။ အချက်အလက်များကိုဖတ်ခြင်းနှင့်ရေးသားခြင်းသည်စာဖတ်ခြင်းနှင့်စာတိုတိုတိုရေးသောစာတိုတိုရေးသောကြောင့်မပြည့်စုံသောမက်ဆေ့ခ်ျများကိုရှောင်ရှားရန်အာမခံနိုင်သည်။

  • Socket_select နားထောင်ပါ
    Socket_select လုပ်ကွက်များကိုဖတ်ရှုခြင်းနှင့် Socket ကိုဖတ်ရန်စောင့်ဆိုင်းရန် CPU ကိုအသုံးပြုခြင်းနှင့် CPU အသုံးချခြင်းကိုတိုးတက်စေရန်နှင့်အသေကောင်ကိုစွန့်ပစ်ပစ္စည်းစွန့်ပစ်ပစ္စည်းများကိုရှောင်ရှားရန်စောင့်နေကြသည်။

  • မက်ဆေ့ခ်ျတန်းစီထိန်းချုပ်မှု (ကျယ်ပြန့်)
    ဥပမာအားဖြင့်၎င်းကိုတိုက်ရိုက်ဖတ်ရှုခြင်းနှင့်တိုက်ရိုက်ရေးသားခြင်းဖြစ်သော်လည်း client network clockockiotion မှရှောင်ရှားရန်ပို့ရန်မက်ဆေ့ခ်ျတစ်ခုစီ၏အရွယ်အစားနှင့်ကြိမ်နှုန်းကိုထိန်းချုပ်ရန်လိုအပ်ချက်များနှင့်အညီစာတစ်စောင်ကိုထပ်ထည့်နိုင်သည်။


6 ။ နောက်ထပ် optimization အကြံပြုချက်များ

  • မြင့်မားသောတစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုကိုတိုးတက်စေရန် Event-Drivent ကဲ့သို့စာကြည့်တိုက်များ (ဥပမာ - လစ်ဗျား) နှင့်ပူးပေါင်းဆောင်ရွက်ရန် Non-blocking mode ကိုသုံးပါ။

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

  • HeartBeat Packet Detection Connection Status ကိုအကောင်အထည်ဖော်ပါ။

  • TCP parameters များကို option လုပ်ရန် Socket_set_option ကို အသုံးပြုပါ။


7 ။ နိဂုံးချုပ်

PHP ၏ Socket_set_set_set_set_blocking function ကို အသုံးပြု. socket_select လုပ်ခြင်းဆိုင်ရာယန္တရားကို အသုံးပြု. ဖြည့်စွက်ခြင်းအားဖြင့် socket_select လုပ်ခြင်းဆိုင်ရာယန္တရားကိုပေါင်းစပ်ခြင်းအားဖြင့်ထိရောက်သောစာတိုပေးပို့ရေးစနစ်နှင့်ထိန်းချုပ်မှုစီးဆင်းမှုကိုတည်ဆောက်နိုင်သည်။ ထိန်းချုပ်မှုစီးဆင်းမှုသည်မက်ဆေ့ခ်ျထုတ်လွှင့်မှု၏တည်ငြိမ်မှုကိုသေချာစေရုံသာမကစနစ်၏တုန့်ပြန်မှုမြန်နှုန်းနှင့်သယံဇာတအသုံးချမှုတို့ကိုလည်းတိုးတက်စေသည်။ ဤဆောင်းပါး၏ပုံနမူနာများနှင့်အတွေးအခေါ်များသည်သင်၏ကိုယ်ပိုင်မက်ဆေ့ခ်ျစနစ်တည်ဆောက်ခြင်းတွင်သင့်အတွက်အထောက်အကူဖြစ်လိမ့်မည်ဟုကျွန်ုပ်မျှော်လင့်ပါသည်။