လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_addrinfo_Connect ကိုဘယ်အချိန်မှာ connection စဉ်အတွင်းပိတ်ဆို့ခြင်းကိုကာကွယ်နည်းများကိုဘယ်လိုကာကွယ်နိုင်မလဲ။

Socket_addrinfo_Connect ကိုဘယ်အချိန်မှာ connection စဉ်အတွင်းပိတ်ဆို့ခြင်းကိုကာကွယ်နည်းများကိုဘယ်လိုကာကွယ်နိုင်မလဲ။

M66 2025-06-22

2 ။ ပိတ်ဆို့မှုကိုကာကွယ်နည်း

ပိတ်ဆို့မှုကိုရှောင်ရှားရန်ကျွန်ုပ်တို့သည် connection process ကိုထိန်းချုပ်ရန်အောက်ပါနည်းလမ်းများကိုယူနိုင်သည်။

2.1 Non-blocking mode ကိုသတ်မှတ်ခြင်း

PHP မှ Socket သည် Mode ကိုပိတ်ဆို့ခြင်း Mode သို့ default သို့ default မှဆိုလိုသည်။ ဆိုလိုသည်မှာ connection သည်အောင်မြင်မှုသို့မဟုတ်အချိန်မရောက်မှီတိုင်အောင်ဆက်သွယ်မှုကိုစောင့်နေစဉ်အစီအစဉ်သည်တင်းကျပ်လိမ့်မည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုချိန်ညှိခြင်းဖြင့်ဤပိတ်ဆို့ခြင်းအပြုအမူကိုကျွန်ုပ်တို့ရှောင်ရှားနိုင်သည်။

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

ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်, ဆက်သွယ်မှုတောင်းဆိုမှုသည်ဝေးလံခေါင်ဖျားသောအိမ်ရှင်ထံမှတုန့်ပြန်မှုကိုမစောင့်ဘဲချက်ချင်းပြန်လာသည်။ ထို့ကြောင့်, အစီအစဉ်သည်အခြားအလုပ်များကိုဆက်လက်လုပ်ဆောင်နိုင်သည်။ connection_select မှတဆင့် socket_select မှတဆင့် socket_select မှတဆင့်သင်စောင့်ကြည့်နိုင်ပါတယ်။

 $timeout = 5;  // အချိန်ကုန်ထားပါ
$start_time = time();
while (true) {
    if (time() - $start_time > $timeout) {
        echo "ဆက်သွယ်မှုအချိန်ကုန်\n";
        break;
    }

    $result = socket_addrinfo_connect($socket, $address, $port);
    if ($result) {
        echo "အောင်မြင်စွာဆက်သွယ်မှု\n";
        break;
    }

    // စောင့်ဆိုင်းပြီးနောက်ထပ်ကြိုးစားပါ
    usleep(100000);
}

2.2 Multiplexing အတွက် Socket_select ကို သုံးပါ

အကယ်. သင်သည်တစ်ချိန်တည်းတွင် Socket Connections မျိုးစုံကိုကိုင်တွယ်ရန်လိုအပ်ပါက socket မျိုးစုံ၏အခြေအနေကိုစောင့်ကြည့်ရန် Socket_select ကို သုံးနိုင်သည်။ ၎င်းသည်ဆက်သွယ်မှုတစ်ခုစီနှင့်ပိတ်ဆို့ခြင်းကိုရှောင်ရှားခြင်းအားဖြင့် loop တစ်ခုတွင် connection မျိုးစုံကိုရှာဖွေတွေ့ရှိရန်ခွင့်ပြုသည်။

 $read = array($socket);
$write = null;
$except = null;
$timeout = 5;  // အချိန်ကုန်ချိန်ညှိခြင်း

// အသုံးပြု socket_select အချိန်ကုန်ခြင်းနှင့်ရှာဖွေတွေ့ရှိပိတ်ဆို့ခြင်း
$changed_sockets = socket_select($read, $write, $except, $timeout);

if ($changed_sockets === false) {
    echo "socket_select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
} elseif ($changed_sockets > 0) {
    // 如果အောင်မြင်စွာဆက်သွယ်မှု,လုပ်ငန်းစဉ်ဆက်သွယ်မှု
    echo "အောင်မြင်စွာဆက်သွယ်မှု\n";
} else {
    echo "ဆက်သွယ်မှုအချိန်ကုန်\n";
}

Socket_select ဖြင့်ဆက်သွယ်မှုသည်ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်အောင်မြင်မှုရှိမရှိကိုကျွန်ုပ်တို့စစ်ဆေးနိုင်ပြီးရိုးရာပိတ်ဆို့ခြင်းလုပ်ငန်းစဉ်ကိုရှောင်ရှားနိုင်သည်။


3 ။ stream_socket_client ကို အခြားရွေးချယ်စရာတစ်ခုအဖြစ်သုံးပါ

Socket_addrinfo_Connect ကို တိုက်ရိုက် သုံး. PHP သည် socket connection များကိုဖန်တီးရန်နှင့်စီမံခန့်ခွဲရန် steam_socket_client function ကိုထောက်ပံ့ပေးသည်။ Steam_socket_cleties သည် ပိုမိုအဆင့်မြင့်သောအင်္ဂါရပ်များကိုထောက်ပံ့ပေးပြီးအချိန်ကုန်ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော mode များကိုအလွယ်တကူသတ်မှတ်ရန်ခွင့်ပြုသည်။

 $address = 'tcp://m66.net:80';
$timeout = 5;  // အချိန်ကုန်ထားပါ
$context = stream_context_create(['socket' => ['timeout' => $timeout]]);
$socket = stream_socket_client($address, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context);

if ($socket === false) {
    echo "ဆက်သွယ်မှုမအောင်မြင်ပါ: $errstr ($errno)\n";
} else {
    echo "အောင်မြင်စွာဆက်သွယ်မှု\n";
    fclose($socket);
}

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


4 ။ သင့်လျော်သောအချိန်ကိုသတ်မှတ်ပါ

Socket_addrinfo_Connect ကို သုံး. stream_socket_client ကို သုံး. သင့်လျော်သောဆက်သွယ်မှုအချိန်ကုန်ကိုသတ်မှတ်ရန်အလွန်အရေးကြီးသည်။ ဝေးလံခေါင်ဖျားသောအိမ်ရှင်သည်အချိန်ကြာမြင့်စွာတုံ့ပြန်မှုမရှိပါကဤအစီအစဉ်သည်အချိန်ကြာမြင့်စွာစောင့်ဆိုင်းလိမ့်မည်။ ယင်းကိုကာကွယ်ရန်ကျိုးကြောင်းဆီလျော်သောအချိန်ကုန်လွှာယန္တရားကိုတည်ဆောက်ရန်အလွန်အရေးကြီးသည်။

Socket_addrinfo_Connect ကိုအသုံးပြုပြီးတဲ့အခါမှာ connection တိုးတက်မှုရဲ့တိုးတက်မှုကိုစောင့်ကြည့်ခြင်းနှင့်အချိန်ကုန်ချိန်ညှိခြင်းအားဖြင့်ကြာမြင့်စွာပိတ်ဆို့ခြင်းကိုရှောင်ရှားနိုင်သည်။

 $timeout = 5;  // အချိန်ကုန်5စက်ဏန့်
$start_time = time();
while (time() - $start_time < $timeout) {
    $result = socket_addrinfo_connect($socket, $address, $port);
    if ($result) {
        echo "အောင်မြင်စွာဆက်သွယ်မှု\n";
        break;
    }
    usleep(100000);  // နောက်တဖန်မကြိုးစားမီခဏစောင့်ပါ
}

အကယ်. ဆက်သွယ်မှုသည်ကြိုတင်သတ်မှတ်ထားသောအချိန်မကျရောက်ဘဲမကျရောက်စေရန်အစီအစဉ်သည်ဆက်သွယ်မှုကိုတက်ကြွစွာကြားဖြတ်နိုင်သည်။