လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_set_Block ကို Socket_select လုပ်ပြီးစောင့်ဆိုင်းရန်

Socket_set_Block ကို Socket_select လုပ်ပြီးစောင့်ဆိုင်းရန်

gitbox 2025-05-28

ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်း၏အခြေခံ

PHP Socket သည် default mode ကို default blocking နေသည်။ ဆိုလိုသည်မှာသင်စာဖတ်ခြင်းသို့မဟုတ်အရင်းအမြစ်များအဆင်သင့်မဖြစ်သေးပါကခေါ်ဆိုမှုသည်စောင့်ဆိုင်းရန်စောင့်ဆိုင်းလိမ့်မည်။ ပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းအစားခေါ်ဆိုမှုသည်ချက်ချင်းပြန်လာလိမ့်မည်။

Socket_set_Set_Block ($ socket) ကို အသုံးပြု ပါ။


Socock_select ဆိုတာဘာလဲ။

Socket_select သည် Multiplect function တစ်ခုဖြစ်ပြီးစာဖတ်ခြင်းနှင့်ရေးသားခြင်းသို့မဟုတ်ချွင်းချက်ပေးရန်သို့မဟုတ်ရေးရန်သို့မဟုတ်ရှိသည်။ ၎င်း၏အခြေခံဖွဲ့စည်းပုံမှာအောက်ပါအတိုင်းဖြစ်သည် -

 socket_select(array &$read, array &$write, array &$except, int $tv_sec, int $tv_usec)
  • $ ဖတ်ရန် : Socket Array "Readable" ပြည်နယ်ကိုစောင့်ဆိုင်းနေသည်

  • $ ရေးရန် : Socket Array ",

  • $ မှလွဲ ။ - "ခြွင်းချက်" ပြည်နယ်ကိုစောင့်ဆိုင်း - Socket Array

  • $ tv_sec / $ tv_usec : စက္ကန့်ပိုင်းနှင့် microseconds အတွက်အချိန်ကုန်စောင့်ဆိုင်းခြင်း


လက်တွေ့သရုပ်ပြခြင်း - client connection ကိုပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်းခြင်း

အောက်ပါသည် client_set_sc_block ကို Socket_ssc_Block ဖြင့်အသုံးပြုသော TCP-based server ဥပမာတစ်ခုဖြစ်သည်။

 <?php
// ဖန်တီး TCP Sockets
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// လိပ်စာပြန်လည်အသုံးပြုပါ
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

// ချည်နေှာင် IP နှင့် ports
socket_bind($socket, '0.0.0.0', 8080);

// စောင့်ကြည့်လေ့လာရေးစတင်ပါ
socket_listen($socket);

// mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ
socket_set_block($socket);

echo "Server started on gitbox.net:8080\n";

// အဓိကကွင်းဆက်
while (true) {
    // နားထောင်ခြင်းခင်းကျင်းမှုကိုအစပြုပါ
    $read = [$socket];
    $write = $except = [];

    // အသုံးပြု socket_select ပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်း
    $changed_sockets = socket_select($read, $write, $except, 0, 0);

    if ($changed_sockets === false) {
        echo "socket_select failed: " . socket_strerror(socket_last_error()) . "\n";
        break;
    }

    // အဓိကလျှင် socket ဖတ်နိုင်သော,ဆက်သွယ်မှုအသစ်တစ်ခုရှိကြောင်းဖော်ပြသည်
    if (in_array($socket, $read)) {
        $client = socket_accept($socket);
        if ($client !== false) {
            echo "New client connected\n";

            // client ကိုမှမက်ဆေ့ခ်ျပို့ပါ
            $msg = "Welcome to gitbox.net server!\n";
            socket_write($client, $msg, strlen($msg));

            // Client Convice Connection
            socket_close($client);
        }
    }
}

// အဓိကပိတ်ပါ socket
socket_close($socket);
?>

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

  1. အပြုအမူကိုပိတ်ဆို့ခြင်း - Socket_set_block ကို အသုံးပြုသည်, connection တောင်းဆိုမှုမရှိပါက Socket_Accept သည် ပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်းလိမ့်မည်။ socket_select နှင့်အတူပေါင်းစပ်, ချည်ပျင်းရိရှောင်ရှားနိုင်ပါတယ်။

  2. ပြောင်းလွယ်ပြင်လွယ်အချိန်ကုန်ထိန်းချုပ်မှု - Socket_select ၏ Socket_select လုပ်ခြင်းသည်ပိတ်ဆို့ခြင်းအချိန်ကိုထိန်းချုပ်ရန်အသုံးပြုနိုင်သည်။

  3. Multi-client support : $ ဖတ်ရန် ခင်းကျင်းရန် Socket မျိုးစုံထည့်ခြင်းဖြင့် Socket_select သည် ဆက်သွယ်မှုမျိုးစုံကိုထိရောက်စွာထောက်ခံနိုင်ပြီးတစ်ပြိုင်နက်တည်း concurnency server တစ်ခုတည်ဆောက်ရန်ပိုမိုလွယ်ကူစေနိုင်သည်။