Php Socket တွင် procy_set_set_set_block () function ကိုအသုံးပြုသောအခါ Socket ကိုပိတ်ထားရန် socket ကိုသတ်မှတ်ရန်အသုံးပြုသည်။ Blocking Mode ဆိုသည်မှာဖတ်ခြင်း ( socket_read (socket_read () ), ရေးခြင်း ( socket_write () ) သို့မဟုတ် connection ကိုလက်ခံရရှိခြင်း, စာဖြင့်ရေးသားခြင်း, ရေးသည်သို့မဟုတ်ဆက်သွယ်မှုကိုမရောက်မချင်းစောင့်ဆိုင်းလိမ့်မည်။ အကယ်. ၎င်းသည်မရှင်းလင်းပါကအချို့သောအခြေအနေများတွင် socket_set_sblock () တွင် PHP screen တစ်ခုလုံးကို "stagnate" တစ်ခုလုံးကိုဖြစ်ပေါ်စေလိမ့်မည်။
Socket_set_sc_block () ကိုအသုံးပြုပြီးနောက် PHP သည်ပိတ်ဆို့ခြင်း mode ကိုရိုက်ထည့်ပြီး Socket operty ၏ရလဒ်ကိုစောင့်ဆိုင်းလိမ့်မည်။ အကယ်. သက်ဆိုင်ရာအရင်းအမြစ် (ဥပမာအချက်အလက်များသို့မဟုတ်ဆက်သွယ်မှုကဲ့သို့သော) သည်အချိန်ကြာမြင့်စွာမပြန်ပါက PHP script သည်စောင့်နေပြီးနောက်ဆက်တွဲကုဒ်ကိုဆက်လက်လုပ်ဆောင်လိမ့်မည်မဟုတ်ပေ။
ဤတွင်ပုံမှန်ဥပမာတစ်ခုဖြစ်သည်။
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
socket_set_block($socket); // mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ
// ဒေတာကိုဖတ်ရန်ကြိုးစားပါ
$response = socket_read($socket, 2048);
echo $response;
socket_close($socket);
?>
အကယ်. ဆာဗာ Gitbox.net သည် အချက်အလက်များကိုချက်ချင်းပြန်ပို့ခြင်းသို့မဟုတ်လုံးဝမတုံ့ပြန်ပါက socket_read () သည် စောင့်နေပြီးဇာတ်ညွှန်းသည် "မှီဝဲ" လိမ့်မည်။ ဤသို့သောနှောင့်နှေးမှုသည်အချိန်ကုန်ယန္တရားကိုအစပျိုးခြင်းမရှိပါကအမှားတစ်ခုမပြုလုပ်နိုင်ပါ, သို့သော်အချိန်ကုန်အချိန်ကိုပုံမှန်အားဖြင့်သတ်မှတ်ခြင်းမရှိပါ။
ရေရှည်ပိတ်ဆို့ခြင်းကိုတားဆီးရန်အတွက်အချိန်ကုန်အချိန်ကိုသတ်မှတ်ရန် Socket_set_option () ကို သုံးပါ။
$timeout = ['sec' => 5, 'usec' => 0]; // အဖြစ်သတ်မှတ်5စက်ဏန့်
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);
၎င်းသည်ပိတ်ဆို့ခြင်းစစ်ဆင်ရေးကိုအချိန်နှင့်အမျှအချိန်အတန်ကြာစောင့်ရှောက်ခြင်းနှင့်အချိန်အတန်ကြာစောင့်ဆိုင်းပြီးနောက်ပြန်သွားပါ။
အကယ်. သင်သည် script ကိုမပိတ်လိုပါက socket_set_nonblock () ကို သုံးနိုင်သည်။
socket_set_nonblock($socket);
ကွင်းဆက်နှင့် USEEP () ဖြင့်ပိတ်ဆို့ခြင်းမရှိသောစောင့်ဆိုင်းမှုကို simulated လုပ်နိုင်သည်။
$buffer = '';
while (true) {
$chunk = @socket_read($socket, 2048);
if ($chunk === false) {
usleep(100000); // အိပ်နေခြင်း100ms
continue;
} elseif ($chunk === '') {
break; // ဆက်သွယ်မှုပိတ်
} else {
$buffer .= $chunk;
}
}
Socket_select () Socketets မျိုးစုံဖတ်ရန်နှင့်ရေးသားရန်အဆင်သင့်ဖြစ်မလာနိုင်ကြောင်းစစ်ဆေးနိုင်ပြီးပိတ်ဆို့ခြင်းလုပ်ငန်းများကိုထိရောက်စွာစီမံရန်နည်းလမ်းတစ်ခုဖြစ်သည်။
$read = [$socket];
$write = NULL;
$except = NULL;
$tv_sec = 5; // အများဆုံးစောင့်ဆိုင်း5စက်ဏန့်
if (socket_select($read, $write, $except, $tv_sec) > 0) {
$response = socket_read($socket, 2048);
echo $response;
} else {
echo "Socket အချိန်ကုန်သို့မဟုတ်အဘယ်သူမျှမဖတ်ရှုနိုင်သောဒေတာ";
}
Socket_select () Socket တွင်ပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းအခြေအနေကိုတိုက်ရိုက် 0 င်ရောက်ခြင်းကိုရှောင်ကြဉ်ခြင်းမပြုမီဖတ်ရန်အချက်အလက်ရှိမရှိဆုံးဖြတ်နိုင်သည်။
Socket_set_Set_Block () ကို အသုံးပြုခြင်းသည်အန္တရာယ်ကင်းမှုမရှိသော်လည်း၎င်း၏အခြေအနေကိုအလွန်ရှင်းလင်းစွာထိန်းချုပ်ရန်လိုအပ်သည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုအသုံးပြုခြင်းသို့မဟုတ်ရှင်းလင်းပြတ်သားစွာပြုလုပ်ရန်အတွက်ကွန်ယက်နှောင့်နှေးမှုနှင့် 0 န်ဆောင်မှုဆိုင်ရာပြ issues နာများကြောင့်အမြဲတမ်းပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်အချိန်ကိုရှင်းလင်းစွာသတ်မှတ်ရန်အကြံပြုသည်။
အချိန်မှန်တုံ့ပြန်မှုသို့မဟုတ်တစ်ပြိုင်နက်တည်းလုပ်ဆောင်ရန်လိုအပ်သည့်ဖြစ်ရပ်များအတွက် socket_set_set_setblock () နှင့် ပေါင်းစပ်ရန်သို့မဟုတ် socket_select () နှင့်ပေါင်းစပ်ရန်သို့မဟုတ် socket_select () နှင့်ပေါင်းစပ်ရန်အကြံပြုသည်။ ၎င်းသည်ပရိုဂရမ်အား 0 င်ရောက်မှုကိုတိုးတက်စေသည်သာမကစနစ်၏တုန့်ပြန်မှုစွမ်းဆောင်ရည်ကိုလည်းများစွာတိုးတက်စေသည်။