လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_accept () ဆက်သွယ်မှုအချိန်ကုန်ထိန်းချုပ်မှုကိုအကောင်အထည်ဖော်ရန် Socket_set_seTime နှင့်ပူးပေါင်းပါ 0 င်သည်

Socket_accept () ဆက်သွယ်မှုအချိန်ကုန်ထိန်းချုပ်မှုကိုအကောင်အထည်ဖော်ရန် Socket_set_seTime နှင့်ပူးပေါင်းပါ 0 င်သည်

M66 2025-05-28

PHP တွင် Client Connection တောင်းဆိုမှုများကိုလက်ခံရန် Socket_accepts () function ကိုအသုံးပြုခြင်းသည်ပုံမှန်အားဖြင့်ဤ function သည်ပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းဖြစ်သည်။ ၎င်းသည် client connection မရှိပါက, ဆက်သွယ်မှုကိုစောင့်ဆိုင်းခြင်းကြောင့်ဤအစီအစဉ်ကိုရှောင်ရှားခြင်းသို့မဟုတ်တုံ့ပြန်မှုမရှိသောအစီအစဉ်ကိုရှောင်ရှားနိုင်ရန်အတွက် socket_set_set_simeout () ကိုပေါင်းစပ်နိုင်ပြီး connection timeout control ကိုအား 0 င်ရောက်နိုင်ရန်အတွက်အစီအစဉ်၏ကြံ့ခိုင်မှုကိုတိုးတက်အောင်ပြုလုပ်နိုင်သည်။

ဤဆောင်းပါးသည် PHP ဆက်သွယ်မှုအချိန်ကုန်ဆုံးထိန်းချုပ်မှုကိုအကောင်အထည်ဖော်ရန် Socket_Accept () နှင့် socket_set_time_timeout () ကို မည်သို့အသုံးပြုရမည်ကိုအသေးစိတ်ဖော်ပြထားသည်။

1 ။ အခြေခံဗဟုသုတပြန်လည်သုံးသပ်ခြင်း

  • Socket_Accept ($ socket)
    client connection တောင်းဆိုမှုကိုပိတ်ဆို့ခြင်းသည် connection တောင်းဆိုမှုတစ်ခုရှိပါက societ အရင်းအမြစ်အသစ်တစ်ခုကိုပြန်ပို့ပေးလိမ့်မည်, သို့မဟုတ်ပါကပိတ်ဆို့လိမ့်မည်။

  • Socket_set_tilout_timeout ($ socket, $ စက္ကန့်ပိုင်း, $ microseconds)
    သတ်မှတ်ထားသော socket အတွက်အချိန်ကုန်အချိန်သတ်မှတ်ထားသည်။ အချိန်ကုန်ပြီးနောက်ဖတ် / ရေးရန်စစ်ဆင်ရေးသည်အချိန်ကုန်အမှားကိုပြန်ပို့သည်။

သတိပြုသင့်သည်မှာ Socket_set_Timeout () သည်အချိန်ကုန်ဆုံးကိုထိန်းချုပ်ရန်နှင့်ရေးသားရန်အတွက်အချိန်ကုန်ထိန်းချုပ်မှုတစ်ခုဖြစ်သည် ထို့ကြောင့်ကျွန်ုပ်တို့သည်စစ်မှန်သောဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်စစ်မှန်သောဆက်သွယ်မှုကိုရရှိရန် (ဥပမာ - ပိတ်ဆို့ခြင်းမဟုတ်သော mode သို့မဟုတ် socket_select () ) နှင့်ပူးပေါင်းဆောင်ရွက်ရန်လိုအပ်သည်။

2 ။ အကောင်အထည်ဖော်မှုစိတ်ကူးများ

  1. နားထောင်ခြင်း socket ကိုပိတ်ဆို့ခြင်း non-blocking mode သို့သတ်မှတ်ပါ ဤနည်းဖြင့် call socket_accept () calling () ကိုပိတ်ဆို့မည်မဟုတ်ပါ။ ဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါက မှားယွင်းစွာ ပြန်လာလိမ့်မည်။

  2. Loop + နှောင့်နှေးမှုကိုစစ်ဆေးပါ ကွင်းဆက်တွင်အကြိမ်ကြိမ် Socket_accept () () ။ အကယ်. မှားယွင်းသော ပြန်လာလျှင်, အချိန်ကုန်ကိုအချိန်ကုန်မနေဆုံးဖြတ်ပါ။ အကယ်. အချိန်ကုန်ကိုအချိန်ကုန်ထားပါကစောင့်ဆိုင်းသူဖြစ်လိမ့်မည်။

  3. ဆက်သွယ်မှုကိုလက်ခံရရှိပြီးသည်နှင့်တပြိုင်နက် Socket_set_simeout () အချိန်ကိုရေးရန်အချိန်ကိုရေးရန်အသုံးပြုပါ နောက်ဆက်တွဲဒေတာထုတ်လွှင့်ချိန်အတွင်းအချိန်ကုန်ထိန်းချုပ်မှုရှိကြောင်းသေချာပါစေ။

3 ။ နမူနာကုဒ်

 <?php
$host = "0.0.0.0";
$port = 12345;
$timeoutSeconds = 10; // အများဆုံးစောင့်ဆိုင်းဆက်သွယ်မှုအချိန်

// ဖန်တီး TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()) . "\n");
}

// ဆိပ်ကမ်း binding
if (socket_bind($socket, $host, $port) === false) {
    die("socket_bind failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// ဆိပ်ကမ်းကိုနားထောင်ပါ
if (socket_listen($socket, 5) === false) {
    die("socket_listen failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// စောင့်ကြည့်လေ့လာခြင်းကို set up socket ပိတ်ဆို့ခြင်းမဟုတ်ပါ
socket_set_nonblock($socket);

$startTime = time();
$clientSocket = false;

echo "client connection ကိုစောင့်ဆိုင်း,ခဏပွဲရပ်ခြင်း:{$timeoutSeconds}စက်ဏန့်\n";

while (true) {
    $clientSocket = @socket_accept($socket);
    if ($clientSocket !== false) {
        echo "client ကိုချိတ်ဆက်ထားသည်!\n";
        break;
    }

    // အချိန်ကုန်ရှိမရှိဆုံးဖြတ်ရန်
    if ((time() - $startTime) >= $timeoutSeconds) {
        echo "client connection ကိုစောင့်ဆိုင်း超时。\n";
        break;
    }

    // အိပ်နေခြင်း 100ms ရေှာင်ရှား CPU အလွန်မြင့်မားသောထေို
    usleep(100000);
}

if ($clientSocket !== false) {
    // client ကိုတက် setting socket အချိန်ကုန်ကိုဖတ်ပြီးရေးပါ,ဥပမာအားဖြင့် 5 စက်ဏန့်
    socket_set_option($clientSocket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
    socket_set_option($clientSocket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>5, "usec"=>0]);

    // client data စာဖတ်ခြင်းဥပမာ
    $buf = '';
    $bytes = socket_recv($clientSocket, $buf, 2048, 0);
    if ($bytes === false) {
        echo "ဒေတာကိုလက်ခံရရှိရန်မအောင်မြင်ပါ:" . socket_strerror(socket_last_error($clientSocket)) . "\n";
    } else {
        echo "client ကိုဒေတာကိုလက်ခံရရှိခဲ့သည်:" . $buf . "\n";
    }

    socket_close($clientSocket);
}

socket_close($socket);
?>

4 ။ ကုဒ်ခွဲခြမ်းစိတ်ဖြာခြင်း

  • ပိတ်ဆို့ခြင်းမဟုတ်သောနားထောင်ခြင်း - Socket_set_set_setChock () ကိုပိတ်ဆို့ခြင်း () ပိတ်ဆို့ခြင်းကိုအသုံးပြုခြင်း,

  • ဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန် Looping : ဆက်သွယ်မှုမရှိပါကအချိန် socket_accept_Accept () တစ်ခုစီကိုခေါ်သည်။ ချက်ချင်း မှား သည်။ အကယ်. အချိန်ကုန်သည်သက်တမ်းကုန်ဆုံးပါကဆက်လက်စောင့်ဆိုင်းပါ။

  • connection ပြီးနောက် timeout ကိုဖတ်ပြီးရေးပါTelection_set_option () နောက်ဆက်တွဲအချက်အလက်များဖတ်ရှုခြင်းကိုတားဆီးရန်အချိန်ကိုဖတ်ရန်အချိန်ကိုဖတ်ရန်နှင့်ရေးရန်အချိန်ကိုဖတ်ပါ။

  • USELEEP () CPU အသုံးပြုမှုကိုလျှော့ချပါ ။ CPU အသုံးပြုမှုကိုဖြစ်ပေါ်စေသည့်ကွက်လပ်များကိုရှောင်ကြဉ်ပါ။

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

နားထောင်ခြင်း socket ကိုပိတ်ဆို့ခြင်းနှင့်ချည်နှောင်ခြင်းမပြုရန်အချိန်ကိုပိတ်ခြင်းနှင့်ကွင်းဆက်မဲရုံများကိုပေါင်းစပ်ခြင်းအားဖြင့်အချိုးအစားကိုဆုံးဖြတ်ရန် thinock_accept ကိုပိတ်ဆို့ခြင်း () စောင့်ဆိုင်းခြင်းအားပိတ်ဆို့ခြင်းကိုပိတ်ဆို့ခြင်းသည်အောင်မြင်စွာထိန်းချုပ်ထားသည်။ တစ်ချိန်တည်းမှာပင် connection ကိုလက်ခံရရှိပြီးနောက် data transmission transment processing ၏တည်ငြိမ်မှုနှင့်လုံခြုံရေးကိုသေချာစေရန် telect_set_set_option () ကို အသုံးပြုပါ။

ဤဖြေရှင်းချက်သည်ရိုးရှင်းပြီးလက်တွေ့ကျသည်။ PHP Service Programs အတွက် Socket connection timeouts လိုအပ်သော PHP Server ပရိုဂရမ်များအတွက်အလွန်သင့်လျော်သည်။