Socket Programming အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ socket_set_set_scking () ကို အသုံးပြုသောအခါ blocking blocking blocking ကိုထိန်းချုပ်ရန်အသုံးပြုသော function တစ်ခုဖြစ်သည်။ developer များစွာသည်သင်ယူမှုသို့မဟုတ်လေ့ကျင့်နေစဉ် function ကိုနားလည်ခြင်းမရှိခြင်းကြောင့်လူအများအပြားသည်ထောင်ချောက်များသို့ကျရောက်နိုင်သည်။ ဤဆောင်းပါးသည်ဤဘုံပြ problems နာများ၏အကြောင်းရင်းများနှင့်သူတို့၏တုန့်ပြန်မှုမဟာဗျူဟာများ၏အကြောင်းရင်းများကိုနက်နက်နဲနဲသုံးသပ်ပေးနိုင်သည်။
Socket_set_blocking (Resource $ socket, bool $ mode) - bool ကို ပိတ်ဆို့ခြင်းသို့မဟုတ်ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ရန်အသုံးပြုသည်။ စစ်မှန်တဲ့ နေရာမှာသက်ဆိုင်ရာဖတ်ခြင်းနှင့်ရေးခြင်းစစ်ဆင်ရေးများသည်ပြီးစီးသည်အထိစောင့်ဆိုင်းလိမ့်မည်။ မှားယွင်းစွာ သတ်မှတ်သည့်အခါ၎င်းသည်အောင်မြင်စွာပြီးဆုံးသည်ဖြစ်စေ, စစ်ဆင်ရေးချက်ချင်းပြန်လာလိမ့်မည်။
ပိတ်ဆို့ခြင်း mode သည်မဲရုံများ၏ရှုပ်ထွေးမှုကိုလျော့နည်းစေနိုင်သည်, သို့သော်မလျော်ကန်စွာကိုင်တွယ်လျှင်၎င်းသည် ဦး ဆောင်လမ်းပြနိုင်သည်။
Program ကိုမှီဝဲ (အကျပ်အတည်း)
ရေရှည်ပိတ်ဆို့ခြင်းသည် 0 န်ဆောင်မှုအချိန်ကုန်ကိုဖြစ်ပေါ်စေသည်
Multi-Threaded / Multi-process အစီအစဉ်များအတွက်အရင်းအမြစ်ယှဉ်ပြိုင်မှု
Socket_set_Set_blocking () တွင်သူတို့၏သက်ရောက်မှုကိုနားလည်ခြင်းမရှိဘဲပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောနိုင်ငံများအကြားပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောပြည်နယ်များအကြားကျပန်းပြောင်းလဲလိမ့်မည်။ ဥပမာအားဖြင့်အောက်ပါကုဒ်များတွင်စာဖတ်စဉ်အစီအစဉ်တစ်ခုလုံးကိုပိတ်ဆို့ခြင်းပြုလုပ်နိုင်သည်။
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
socket_set_blocking($socket, false);
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
// ဤနေရာတွင်ချက်ချင်းပိတ်ဆို့ရန်ပြန်ပြောင်းပါ,အကျပ်အတည်းကိုဖြစ်ပေါ်စေနိုင်သည်
socket_set_blocking($socket, true);
$response = socket_read($socket, 2048);
Solution: mode ကိုတတ်နိုင်သမျှတူညီစွာသုံးရန်ကြိုးစားပါ, socket_select လုပ်ခြင်းအတွက်ပိတ်ဆို့ခြင်းမပြုလုပ်ပါနှင့်,
အကယ်. သင်သည်စာဖတ်ခြင်းအတွက်ပိတ်ဆို့ခြင်း mode ကိုအသုံးပြုပါက, ဆာဗာသည်အချိန်ကြာမြင့်စွာတုံ့ပြန်ခြင်းမရှိပါ။
$response = socket_read($socket, 2048); // ဆာဗာသည်အချက်အလက်များကိုမပို့ပါက,ဒါဟာဒီမှာပိတ်ဆို့လိမ့်မည်
ဖြေရှင်းချက် - အမြဲတမ်းပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်ကျိုးကြောင်းဆီလျော်သောအချိန်ကိုသတ်မှတ်ပါ။ အောက်ပါနည်းလမ်းကို အသုံးပြု. reception uncome ကိုသတ်မှတ်ပါ -
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>3, "usec"=>0]);
ဤနည်းအားဖြင့်ဆာဗာသည်မတုံ့ပြန်လျှင်ပင် 3 စက္ကန့်အထိစောင့်ဆိုင်းပြီးနောက်ထိန်းချုပ်မှုသို့ပြန်သွားပါလိမ့်မည်။
Socket_select () သည်ပိတ်ဆို့ခြင်းမဟုတ်သောယုတ္တိဗေဒကိုပိတ်ဆို့ခြင်းအတွက်အရေးကြီးသောကိရိယာတစ်ခုဖြစ်သည်။ ၎င်းသည် Socket မျိုးစုံအခြေအနေပြောင်းလဲမှုများကိုနားထောင်နိုင်သည်, အမှန်တကယ်စစ်ဆင်ရေးအဆင်သင့်မဖြစ်သေးပါ။ server-side programs များအတွက်ဆက်သွယ်မှုမျိုးစုံကိုကိုင်တွယ်သောဆာဗာဘေးထွက်အစီအစဉ်များအတွက်သင့်တော်သည်။ ဥပမာအားဖြင့်:
$read = [$socket];
$write = null;
$except = null;
if (socket_select($read, $write, $except, 5)) {
$data = socket_read($socket, 2048);
}
ဤနည်းလမ်းသည် အကျပ်အတည်းများကို ဒေတာအဆင်သင့်ဖြစ်သည့်အခါမှသာလျှင်အကျပ်အတည်းကိုထိရောက်စွာရှောင်ရှားနိုင်သည်။
ဖွံ့ဖြိုးတိုးတက်မှုအတွက်အခြားဘုံဘုံဘုံဖာဂူဘုရှေ့ရေးအရပိတ်ဆို့ခြင်းနှင့်အချိန်ကုန်များကိုစနစ်တကျကိုင်တွယ်ဖြေရှင်းခြင်းမပြုရန်,
Gitbox.net ရှိ 0 န်ဆောင်မှုတစ်ခုနှင့်ချိတ်ဆက်ပါဆိုပါစို့။
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 12345);
socket_set_blocking($socket, true); // ဆာဗာနှေးနှေးပါက,စောင့်ဆိုင်းစောင့်ရှောက်မည်
ဖြေရှင်းနည်း - စာရေးချိန် ( So_sndtimeo ) ကိုရေးပြီးအချိန်ကုန် ( So_RCVTOOO ) ကိုဖတ်ပါ။
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>2, "usec"=>0]);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>3, "usec"=>0]);
PHP ၏ Socket function function မိသားစုနှင့် stream encapsulation (ဥပမာ fsocckopen) ) ကိုရောထွေးနိုင်သည်, အကယ်. သင်သည် stream_set_set_blocking () ကို အသုံးပြုပါက socket_ * socient `စာဖတ်ခြင်းကိုဖတ်ရန်နှင့်ရေးရန်လုပ်ဆောင်ချက်များကိုအသုံးပြုပါ။
Stream_set_client () နှင့် stream_clocking () နှင့် တွဲဖက်ခြင်း () နှင့်ရောနှောခြင်းမှရှောင်ရှားရန် socket_create () ကိုသုံးရန် socket_create () ကဲ့သို့သောအခြေခံ socket function များကိုသုံးရန်အကြံပြုသည်။