PHP တွင် Client Connection တောင်းဆိုမှုများကိုလက်ခံရန် Socket_accepts () function ကိုအသုံးပြုခြင်းသည်ပုံမှန်အားဖြင့်ဤ function သည်ပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းဖြစ်သည်။ ၎င်းသည် client connection မရှိပါက, ဆက်သွယ်မှုကိုစောင့်ဆိုင်းခြင်းကြောင့်ဤအစီအစဉ်ကိုရှောင်ရှားခြင်းသို့မဟုတ်တုံ့ပြန်မှုမရှိသောအစီအစဉ်ကိုရှောင်ရှားနိုင်ရန်အတွက် socket_set_set_simeout () ကိုပေါင်းစပ်နိုင်ပြီး connection timeout control ကိုအား 0 င်ရောက်နိုင်ရန်အတွက်အစီအစဉ်၏ကြံ့ခိုင်မှုကိုတိုးတက်အောင်ပြုလုပ်နိုင်သည်။
ဤဆောင်းပါးသည် PHP ဆက်သွယ်မှုအချိန်ကုန်ဆုံးထိန်းချုပ်မှုကိုအကောင်အထည်ဖော်ရန် Socket_Accept () နှင့် socket_set_time_timeout () ကို မည်သို့အသုံးပြုရမည်ကိုအသေးစိတ်ဖော်ပြထားသည်။
Socket_Accept ($ socket)
client connection တောင်းဆိုမှုကိုပိတ်ဆို့ခြင်းသည် connection တောင်းဆိုမှုတစ်ခုရှိပါက societ အရင်းအမြစ်အသစ်တစ်ခုကိုပြန်ပို့ပေးလိမ့်မည်, သို့မဟုတ်ပါကပိတ်ဆို့လိမ့်မည်။
Socket_set_tilout_timeout ($ socket, $ စက္ကန့်ပိုင်း, $ microseconds)
သတ်မှတ်ထားသော socket အတွက်အချိန်ကုန်အချိန်သတ်မှတ်ထားသည်။ အချိန်ကုန်ပြီးနောက်ဖတ် / ရေးရန်စစ်ဆင်ရေးသည်အချိန်ကုန်အမှားကိုပြန်ပို့သည်။
သတိပြုသင့်သည်မှာ Socket_set_Timeout () သည်အချိန်ကုန်ဆုံးကိုထိန်းချုပ်ရန်နှင့်ရေးသားရန်အတွက်အချိန်ကုန်ထိန်းချုပ်မှုတစ်ခုဖြစ်သည် ။ ထို့ကြောင့်ကျွန်ုပ်တို့သည်စစ်မှန်သောဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်စစ်မှန်သောဆက်သွယ်မှုကိုရရှိရန် (ဥပမာ - ပိတ်ဆို့ခြင်းမဟုတ်သော mode သို့မဟုတ် socket_select () ) နှင့်ပူးပေါင်းဆောင်ရွက်ရန်လိုအပ်သည်။
နားထောင်ခြင်း socket ကိုပိတ်ဆို့ခြင်း non-blocking mode သို့သတ်မှတ်ပါ ဤနည်းဖြင့် call socket_accept () calling () ကိုပိတ်ဆို့မည်မဟုတ်ပါ။ ဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါက မှားယွင်းစွာ ပြန်လာလိမ့်မည်။
Loop + နှောင့်နှေးမှုကိုစစ်ဆေးပါ ကွင်းဆက်တွင်အကြိမ်ကြိမ် Socket_accept () () ။ အကယ်. မှားယွင်းသော ပြန်လာလျှင်, အချိန်ကုန်ကိုအချိန်ကုန်မနေဆုံးဖြတ်ပါ။ အကယ်. အချိန်ကုန်ကိုအချိန်ကုန်ထားပါကစောင့်ဆိုင်းသူဖြစ်လိမ့်မည်။
ဆက်သွယ်မှုကိုလက်ခံရရှိပြီးသည်နှင့်တပြိုင်နက် Socket_set_simeout () အချိန်ကိုရေးရန်အချိန်ကိုရေးရန်အသုံးပြုပါ နောက်ဆက်တွဲဒေတာထုတ်လွှင့်ချိန်အတွင်းအချိန်ကုန်ထိန်းချုပ်မှုရှိကြောင်းသေချာပါစေ။
<?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);
?>
ပိတ်ဆို့ခြင်းမဟုတ်သောနားထောင်ခြင်း - Socket_set_set_setChock () ကိုပိတ်ဆို့ခြင်း () ပိတ်ဆို့ခြင်းကိုအသုံးပြုခြင်း,
ဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန် Looping : ဆက်သွယ်မှုမရှိပါကအချိန် socket_accept_Accept () တစ်ခုစီကိုခေါ်သည်။ ချက်ချင်း မှား သည်။ အကယ်. အချိန်ကုန်သည်သက်တမ်းကုန်ဆုံးပါကဆက်လက်စောင့်ဆိုင်းပါ။
connection ပြီးနောက် timeout ကိုဖတ်ပြီးရေးပါ ။ Telection_set_option () နောက်ဆက်တွဲအချက်အလက်များဖတ်ရှုခြင်းကိုတားဆီးရန်အချိန်ကိုဖတ်ရန်အချိန်ကိုဖတ်ရန်နှင့်ရေးရန်အချိန်ကိုဖတ်ပါ။
USELEEP () CPU အသုံးပြုမှုကိုလျှော့ချပါ ။ CPU အသုံးပြုမှုကိုဖြစ်ပေါ်စေသည့်ကွက်လပ်များကိုရှောင်ကြဉ်ပါ။
နားထောင်ခြင်း socket ကိုပိတ်ဆို့ခြင်းနှင့်ချည်နှောင်ခြင်းမပြုရန်အချိန်ကိုပိတ်ခြင်းနှင့်ကွင်းဆက်မဲရုံများကိုပေါင်းစပ်ခြင်းအားဖြင့်အချိုးအစားကိုဆုံးဖြတ်ရန် thinock_accept ကိုပိတ်ဆို့ခြင်း () စောင့်ဆိုင်းခြင်းအားပိတ်ဆို့ခြင်းကိုပိတ်ဆို့ခြင်းသည်အောင်မြင်စွာထိန်းချုပ်ထားသည်။ တစ်ချိန်တည်းမှာပင် connection ကိုလက်ခံရရှိပြီးနောက် data transmission transment processing ၏တည်ငြိမ်မှုနှင့်လုံခြုံရေးကိုသေချာစေရန် telect_set_set_option () ကို အသုံးပြုပါ။
ဤဖြေရှင်းချက်သည်ရိုးရှင်းပြီးလက်တွေ့ကျသည်။ PHP Service Programs အတွက် Socket connection timeouts လိုအပ်သော PHP Server ပရိုဂရမ်များအတွက်အလွန်သင့်လျော်သည်။