Network Programming အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ stream_socket_recvfrom function သည် UDP packets များကိုရရှိလေ့ရှိသည်။ သို့သော်ပုံမှန်အားဖြင့်ဒေတာကိုလက်ခံရရှိသည်အထိဒေတာများကိုရှာဖွေသည်အထိသို့မဟုတ်အမှားတစ်ခုဖြစ်သည့်အမှားအယွင်းများကိုစောင့်ဆိုင်းနေစဉ်ဤလုပ်ဆောင်ချက်သည်လုပ်ကွက်များကိုစောင့်ဆိုင်းနေစဉ်သို့မဟုတ်အမှားတစ်ခုဖြစ်သည့်အမှားအယွင်းများဖြစ်ပေါ်သည်။ ဤရှည်လျားသောပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်ကျွန်ုပ်တို့သည်ဖတ်ရှုရန်အချိန်ကုန်ကိုသတ်မှတ်ရန်လိုအပ်သည်။
ဤဆောင်းပါးသည်ပရိုဂရမ်အပြုအမူကိုပိုမိုကောင်းမွန်စွာထိန်းချုပ်ရန်အတွက် stream_socket_recvfrom function တွင်ဖတ်ရန်အချိန်ကိုမည်သို့သတ်မှတ်မည်ကိုအသေးစိတ်ရှင်းပြပါမည်။
stream_socket_recvfrom function ၏အခြေခံအသုံးပြုမှုသည်အောက်ပါအတိုင်းဖြစ်သည် -
$data = stream_socket_recvfrom($socket, 1024);
၎င်းသည်သတ်မှတ်ထားသော $ socket မှဒေတာ 1024 ခုအထိဖတ်ပါလိမ့်မည်။ အကယ်. ဒေတာမရောက်ရှိပါက function လုပ်ကွက်များနှင့်စောင့်နေကြသည်။
Peer_Socket_recvfrom ကိုခေါ်သည့်အခါ, သက်တူရွယ်တူသည်အချိန်ကြာမြင့်စွာမပို့ပါက, အချိန်ကြာမြင့်စွာမှီဝဲနေသည့်အစီအစဉ်ကိုရှောင်ရှားနိုင်ရန်အတွက်ကျွန်ုပ်တို့သည်အချိန်ကုန်ယန္တရားတစ်ခုချမှတ်ရန်လိုအပ်သည်။
PHP တွင်စစ်ဆင်ရေးစီးဆင်းမှုသည် stream_set_seout_timeout function မှတဆင့်အကောင်အထည်ဖော်သည်။ ဤလုပ်ဆောင်ချက်သည်ပွင့်လင်းသောစီးဆင်းမှုအတွက်အချိန်ကုန်အချိန်သတ်မှတ်နိုင်သည်။
ဥပမာ -
// ဖန်တီး UDP socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法ဖန်တီးsocket: $errstr ($errno)\n");
}
// အချိန်ကုန်ထားပါ,စက္ကန့်ပိုင်းအတွင်းနှင့် microseconds အတွက်ယူနစ်
// 这里အချိန်ကုန်ထားပါ时间为 5 စက်ဏန့်
stream_set_timeout($socket, 5);
// တစ် ဦး ဖတ် function ကိုခေါ်ခြင်း
$data = stream_socket_recvfrom($socket, 1024);
$info = stream_get_meta_data($socket);
if ($info['timed_out']) {
echo "ဒေတာအချိန်ကုန်ကိုဖတ်ပါ,စောင့်ဆိုင်းအရှုံးမပေး\n";
} else {
echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
}
steam_set_simeout ($ Socket, 5) သည် 5 စက္ကန့်ကြာအောင်သတ်မှတ်ထားသည်။
ဒေတာများကိုဖတ်ပြီးနောက်, stream_get_meta_data ($ socket) ဖြင့်အချိန်ကုန်ကိုဆုံးဖြတ်ခြင်းရှိမရှိဆုံးဖြတ်ပါ။
အချိန်ကုန်ကိရိယာအပြင်အခြားဘုံအလေ့အကျင့်တစ်ခုမှာ socket ကိုပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ရန်နှင့်အခါအားရွေးခြင်းသို့မဟုတ်အဖြစ်အပျက် -ard-driven in နှင့်တွဲဖက်ထားသည့်အချက်အလက်များကိုဖတ်ရန်ဖြစ်သည်။
// ဖန်တီး socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法ဖန်တီးsocket: $errstr ($errno)\n");
}
// Non-blocking mode ကိုသတ်မှတ်ပါ
stream_set_blocking($socket, false);
$startTime = time();
$timeout = 5; // စက်ဏန့်
while (true) {
$data = stream_socket_recvfrom($socket, 1024);
if ($data !== false && $data !== '') {
echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
break;
}
if (time() - $startTime > $timeout) {
echo "အချိန်ကုန်ကိုဖတ်ပါ,ကွင်းဆက်မှထွက်ပါ\n";
break;
}
// ရေှာင်ရှားCPUအလွန်မြင့်မားသောထေို,သင့်လျော်စွာအိပ်ပါ
usleep(100000); // 100毫စက်ဏန့်
}
ဤနည်းလမ်းသည်ဖတ်ရန်ယုတ္တိဗေဒကိုပိုမိုပြောင်းလွယ်ပြင်လွယ်ထိန်းချုပ်နိုင်ပြီး Event Loops ၏ပေါင်းစည်းမှုကိုလွယ်ကူချောမွေ့စေသည်။
stream_socket_recvfrom လုပ်ကွက်များပုံမှန်အားဖြင့်လုပ်ကွက်များပုံမှန်အားဖြင့်ပြုလုပ်နိုင်သည်။ ၎င်းသည်အစီအစဉ်ကိုအချိန်ကြာမြင့်စွာစောင့်ဆိုင်းစေနိုင်သည်။
ရှည်လျားလွန်းရန်အတွက်ပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်အချိန်ကုန်အချိန်ကိုသတ်မှတ်ရန် stream_set_set_timeout ကို သုံးပါ။
စာဖတ်ပြီးနောက် timeout ရောက်ရှိခြင်းရှိမရှိဆုံးဖြတ်ရန် stream_get_meta_data ကို သုံးပါ။
ကော်မတီမဟုတ်သော mode ကိုလည်း အသုံးပြု. မဲရုံများအားမဲရုံများဖြင့်ထိန်းချုပ်ရန်လည်းအသုံးပြုနိုင်သည်။
ကျိုးကြောင်းဆီလျော်စွာအချိန်ကုန် parameters တွေကိုချိန်ညှိခြင်းကွန်ယက်ပရိုဂရမ်များကိုတည်ငြိမ်သောတုန့်ပြန်မှုကိုသေချာစွာတုန့်ပြန်ရန်သော့ချက်ဖြစ်သည်။