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

bocket_set_option နှင့် socket_select ကိုပေါင်းစပ်ခြင်းအတွက်ပေါင်းစပ်အသုံးပြုသည်

gitbox 2025-05-26

PHP Network Programming တွင်ကိုင်တွယ်မှုမြှောက်ခဲမှုသည်ထိရောက်သောကွန်ရက် 0 န်ဆောင်မှုများကိုရရှိရန်အတွက်အဓိကနည်းပညာဖြစ်သည်။ Socket_set_option နှင့် Socket_select သည် PHP Socket Programming တွင်အရေးကြီးသောလုပ်ဆောင်ချက်နှစ်ခုဖြစ်သည်။ developer များစွာသည်၎င်းတို့ကိုအတူတကွအသုံးပြုနိုင်သည်, အထူးသဖြင့်အကောင်အထည်ဖော်သည့်အခါမှန်ကန်စွာကိုက်ညီရမည်ကိုစဉ်းစားကြလိမ့်မည်။

ဤဆောင်းပါးသည် socket_set_set_option နှင့် socket_select ၏အခန်းကဏ် and ကိုအသေးစိတ်ရှင်းပြပါလိမ့်မည်, ၎င်းတို့ကိုအတူတကွအသုံးပြုနိုင်သည်, မပြည့်စုံနိုင်အောင်မည်သို့အသုံးပြုရမည်ကိုမိတ်ဆက်ပေးပါမည်။


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

Socket_set_option

Socket_set_option သည် socket များအတွက်ရွေးချယ်စရာများအတွက်ရွေးချယ်စရာများအတွက်ရွေးချယ်စရာများကိုအသုံးပြုသည်။ လိပ်စာကိုပြန်လည်အသုံးပြုခြင်း,

 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

အထက်ပါကုဒ်သည် address Reuse option ကို socket ကို socket ကိုသတ်မှတ်သည်။ ၎င်းသည်ဆာဗာပြန်လည်စတင်သည့်အခါ ports များကိုမြန်မြန်ဆန်ဆန်ချည်နှောင်ထားလေ့ရှိသည်။

Socket_select

Socket_select သည် Multiplexing ကိုအကောင်အထည်ဖော်ရန်အဓိကလုပ်ဆောင်ချက်ဖြစ်သည်။ ၎င်းသည် socket မျိုးစုံအတွက်နားထောင်ရန်အသုံးပြုသည်။ Socket များထဲမှတစ်ခုသို့မဟုတ်တစ်ခုထက် ပို. ဖတ်ရန်နှင့်ရေးသားရန်အဆင်သင့်ဖြစ်သည့် function ကိုပြန်ပို့သည်။ ၎င်းသည်တစ်ပြိုင်နက်တည်း connection မျိုးစုံကိုတစ်ပြိုင်နက်တည်းကိုင်တွယ်ရန်တစ် ဦး တည်းချည်ထားသောအစီအစဉ်ကိုခွင့်ပြုသည်။

 $read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;

$num_changed = socket_select($read, $write, $except, $timeout);

Socket_select သည် ဒေါ်လာဖတ်ရန် , ဒေါ်လာရေးရန် နှင့် arrays မှလွဲ. $ array မှလွဲ . ပြန်လည်ပြင်ဆင်ခြင်းဖြင့်ပြင်ဆင်ထားသော socketets များကိုပြန်လည်ရောက်ရှိစေသည်။


2 ။ socket_set_option နှင့် socket_select ကိုအတူတကွအသုံးပြုနိုင်ပါသလား။

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

  • socket_set_option ကို (ဥပမာအချိန်ကုန်များ, ကြားခံစသည်တို့) ကိုပြုပြင်ရန်အသုံးပြုသည်။

  • Socket_select ကို Socket မျိုးစုံဖတ်လို့မရတဲ့,

Multipliming သည်အဓိကအားဖြင့် Socket_set_Ontect_Socke ဂုဏ်သတ္တိများကိုသာအများအားဖြင့် socket ၏ဂုဏ်သတ္တိများကိုသာညှိသည်


3 ။ Socket_select နှင့်မြှောက်ထားသောဥပမာများကိုအကောင်အထည်ဖော်ရန် Socket_set_option ကိုသုံးပါ

အောက်ဖော်ပြပါသည် Socket_set_Set_Option ကို Socket_set_Settion ကို socket_set_option ဖြင့် socket_set_option ဖြင့်မည်သို့သတ်မှတ်ရမည်နည်း။

 <?php
// ဖန်တီး TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);

// ဆိပ်ကမ်း binding
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

$clients = [];
$read = [$server];

while (true) {
    $readSockets = $read;
    $write = null;
    $except = null;

    // မျိုးစုံနားထောင်ပါ socket ပြောင်းလဲမှုများ
    $numChanged = socket_select($readSockets, $write, $except, 5);

    if ($numChanged === false) {
        echo "socket_select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
        break;
    } elseif ($numChanged > 0) {
        // ဖောက်သည်အသစ်တစ်ခုကိုနားထောင်ပါ
        if (in_array($server, $readSockets)) {
            $newClient = socket_accept($server);
            if ($newClient !== false) {
                socket_set_option($newClient, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
                $clients[] = $newClient;
                $read[] = $newClient;
                echo "ဖောက်သည်အသစ်\n";
            }
            unset($readSockets[array_search($server, $readSockets)]);
        }

        // လက်ရှိဖောက်သည်များကပေးပို့သောလုပ်ငန်းစဉ်အချက်အလက်များ
        foreach ($readSockets as $socket) {
            $data = socket_read($socket, 1024, PHP_NORMAL_READ);
            if ($data === false || $data === '') {
                // ဆက်သွယ်မှုပိတ်
                socket_close($socket);
                unset($clients[array_search($socket, $clients)]);
                unset($read[array_search($socket, $read)]);
                echo "client ကိုအဆက်ပြတ်\n";
            } else {
                $data = trim($data);
                echo "client ကိုဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
                // တုံ့ပြန်မှုတစ်ခုပို့ပါ
                socket_write($socket, "ဆာဗာကိုလက်ခံရရှိခဲ့သည်: $data\n");
            }
        }
    }
}
socket_close($server);

အဓိကအချက်များဖော်ပြချက်:

  • server socket $ ဆာဗာသည် soec_setdre ကို sockeuseaddr ကို sockeuseaddr ကို sockeuseaddr ကို တပ်ဆင်ထားသည်။

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

  • Socket_Select သည် တက်ကြွသော client sockets နှင့် server sockets များအားလုံးကိုနားထောင်သည်။


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

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

  • Socket_set_option သည် socket parameters များကို configure လုပ်ခြင်းနှင့်ကွန်ရက်စွမ်းဆောင်ရည်နှင့်အပြုအမူများကိုပိုမိုကောင်းမွန်စေရန်တာ 0 န်ရှိသည်။

  • Socket_select သည် Socket Events မျိုးစုံကိုမြှောက်ခြင်းနှင့်နားထောင်ခြင်းအတွက်တာ 0 န်ရှိသည်။

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


PHP Socket Multiplexing ကိုသင်လေ့လာလိုပါကအသေးစိတ်နှင့်အဆင့်မြင့်ကျွမ်းကျင်မှုများကိုကျွမ်းကျင်ရန်တရားဝင်စာရွက်စာတမ်းများနှင့်ဆက်စပ်ကွန်ယက်ပရိုဂရမ်စာအုပ်များကိုလည်းသင်ရည်ညွှန်းနိုင်သည်။


ဆောင်းပါး၏ပုံနမူနာအတွက် URL ဒိုမိန်းအမည်မှာအောက်ပါအတိုင်းဖြစ်သည် -

 $url = "https://gitbox.net/api/socket_demo";