လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Long Connection မြင်ကွင်းတွင်ထိရောက်စွာဆက်သွယ်မှုစီမံခန့်ခွဲမှုရရှိရန် Socket_Accept () function ကိုအသုံးပြုနည်း။

Long Connection မြင်ကွင်းတွင်ထိရောက်စွာဆက်သွယ်မှုစီမံခန့်ခွဲမှုရရှိရန် Socket_Accept () function ကိုအသုံးပြုနည်း။

M66 2025-06-15

ကွန်ယက်ပရိုဂရမ်တွင်အထူးသဖြင့်ရှည်လျားသောဆက်သွယ်မှုများပါ 0 င်သောအခြေအနေများတွင်ဆာဗာသည် client connections မျိုးစုံကိုစဉ်ဆက်မပြတ်နားထောင်ရန်နှင့်စီမံခန့်ခွဲရန်လိုအပ်သည်။ PHP သည်ကြွယ်ဝသော socket function ကိုထောက်ပံ့ပေးသည်။ Socket_accept () သည် client connection တောင်းဆိုမှုများကိုလက်ခံရရှိရန်အသုံးပြုသောအရေးကြီးသောလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ဤဆောင်းပါးသည် Long Connection Connection အခြေအနေများတွင်ထိရောက်စွာဆက်သွယ်မှုစီမံခန့်ခွဲမှုရရှိရန် Socket_Accept ကို အသုံးပြုရမည်ကိုအသေးစိတ်မိတ်ဆက်ပေးပါလိမ့်မည်။

1 ။ နိဒါန်းရှည်လျားသောဆက်သွယ်မှုမှ

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

2 ။ အဆိုပါ socket_accept ၏အခန်းကဏ် and နှင့်အခြေခံအသုံးပြုမှု ()

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

 $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 8080);
socket_listen($serverSocket);

while (true) {
    $clientSocket = socket_accept($serverSocket);
    if ($clientSocket === false) {
        // အမှားများကိုကိုင်တွယ်
        continue;
    }
    // Process client ကိုတောင်းဆိုမှုများ
}

3 ။ ကြာရှည်စွာချိတ်ဆက်ထားသောအခြေအနေများတွင်ပြ problems နာများနှင့်စိန်ခေါ်မှုများ

  1. ပြ problem နာကိုပိတ်ဆို့ခြင်း
    Socket_Accept () သည်ပိတ်ဆို့ခြင်းခေါ်ဆိုမှုတစ်ခုဖြစ်သည်။ ဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါကဤအစီအစဉ်သည်ဤနေရာတွင်ရပ်တန့်သွားမည်,

  2. ဆက်သွယ်မှုစီမံခန့်ခွဲမှု Multi- ဆက်သွယ်မှုစီမံခန့်ခွဲမှု တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင် client converts clients ဆက်သွယ်မှုမျိုးစုံ၏စစ်ဆင်ရေးများကိုစီမံရန်လိုအပ်သည်။

  3. အရင်းအမြစ်သိမ်းယူ <br> <br> ရှည်လျားသောဆက်သွယ်မှုများသည်စနစ်အရင်းအမြစ်များကိုသိမ်းပိုက်ပြီးကျိုးကြောင်းဆီလျော်သောဖြန့်ချိခြင်းနှင့်ပြုပြင်ထိန်းသိမ်းမှုလိုအပ်လိမ့်မည်။

4 ။ ထိရောက်သောရှည်လျားသောဆက်သွယ်မှုစီမံခန့်ခွဲမှုအတွက်အဓိကကျွမ်းကျင်မှု

1 ။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသုံးပါ

socket_set_set_set_set_set_nonblock () ဆက်သွယ်မှုကိုရှောင်ခြင်းနှင့်စောင့်ဆိုင်းခြင်းမပြုရန် socket_set_setblock () ကိုထားပါ။

 socket_set_nonblock($serverSocket);

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

2 ။ socket_select () ကိုအကောင်အထည်ဖော်ရန် () ကိုသုံးပါ

Socket_select () သည် စာဖတ်ခြင်းကိုနားထောင်ရန်နှင့် Sockets မျိုးစုံကိုတစ်ပြိုင်နက်တည်းရေးရန်ခွင့်ပြုသည်။

နမူနာကုဒ်:

 $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 8080);
socket_listen($serverSocket);
socket_set_nonblock($serverSocket);

$clients = [];

while (true) {
    $readSockets = $clients;
    $readSockets[] = $serverSocket;

    $write = $except = null;
    $numChangedSockets = socket_select($readSockets, $write, $except, 0, 500000);

    if ($numChangedSockets === false) {
        // အမှားကိုင်တွယ်
        break;
    } elseif ($numChangedSockets > 0) {
        // ဆက်သွယ်မှုအသစ်ရှိမရှိကိုနားထောင်ပါ
        if (in_array($serverSocket, $readSockets)) {
            $newClient = socket_accept($serverSocket);
            if ($newClient !== false) {
                socket_set_nonblock($newClient);
                $clients[] = $newClient;
            }
            // လုပ်ငန်းများ၌နားထောင်ခြင်း sockets ဖယ်ရှားပါ
            $key = array_search($serverSocket, $readSockets);
            unset($readSockets[$key]);
        }

        // client data လုပ်ငန်းစဉ်
        foreach ($readSockets as $clientSocket) {
            $data = @socket_read($clientSocket, 1024, PHP_NORMAL_READ);
            if ($data === false || $data === '') {
                // client ကို connection ကိုပိတ်လိုက်
                $key = array_search($clientSocket, $clients);
                socket_close($clientSocket);
                unset($clients[$key]);
            } else {
                $data = trim($data);
                if ($data) {
                    // 这里client data လုပ်ငန်းစဉ်
                    socket_write($clientSocket, "ဆာဗာကိုလက်ခံရရှိခဲ့သည်: $data\n");
                }
            }
        }
    }

    // HeartBeat detection ကိုဤနေရာတွင်ထည့်နိုင်သည်、အချိန်ကုန်အပြောင်းအလဲနဲ့နှင့်အခြားယုတ္တိဗေဒ
}

3 ။ ဆက်သွယ်မှုစီမံခန့်ခွဲမှု optimization

  • HeartBeat ယန္တရား - 0 န်ဆောင်မှုခံယူသူ၏ရှင်သန်ရပ်တည်ရေးကိုရှာဖွေရန်နှင့်အချိန်မီမမှန်ကန်သောဆက်သွယ်မှုများကိုပိတ်ပါ။

  • Connection pool : သယံဇာတပင်ပန်းနွမ်းနယ်မှုကိုရှောင်ရှားရန်အမြင့်ဆုံးဆက်သွယ်မှုအရေအတွက်ကိုကန့်သတ်ပါ။

  • အချိန် ကြာမြင့်စွာ data interaction မရှိသောအနီးကပ်ဆက်သွယ်မှုများ။

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

ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ခြင်းနှင့် Socket_election နည်းပညာကိုပေါင်းစပ်ခြင်းဖြင့် PHP သည် Long Connections ၏တစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုများကိုစီမံခန့်ခွဲရန် Socket_Accept () ကို ထိရောက်စွာအသုံးပြုနိုင်ပြီး 0 န်ဆောင်မှုပေးသောဆက်သွယ်မှုများစွာကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်ခြင်းကိုရှာဖွေခြင်း, ဆင်ခြင်တုံတရားဖြင့်ချိတ်ဆက်ခြင်းနှင့်အရင်းအမြစ်စီမံခန့်ခွဲမှုယန္တရားများကိုဒီဇိုင်းဆွဲခြင်းယန္တရားများသည်တည်ငြိမ်သော server လည်ပတ်မှုနှင့်ရှည်လျားသောဆက်သွယ်မှုအခြေအနေများတွင်စွမ်းဆောင်ရည်ကိုတိုးတက်စေနိုင်သည်။