Network Programming အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ TCP ဆာဗာတစ်ခုကိုဖန်တီးရန် Developmer_Accept ()) ကို အသုံးပြုသောအခါ developer_Accept () ကိုအသုံးပြုသည့်အခါပြ a နာတစ်ခုမှာပြ a နာတစ်ခုဖြစ်လေ့ရှိသည်။ ဤဖြစ်စဉ်သည်အများအားဖြင့် "ပိတ်ဆို့ခြင်း mode" နှင့် "ပိတ်ဆို့ခြင်းမရှိသော mode" ကိုမလုံလောက်ခြင်းမှအများအားဖြင့်အဓိကအားဖြင့်အဓိကအားဖြင့်အဓိကထားသည်။ ဤဆောင်းပါးသည်အဘယ်ကြောင့် Socket_Accept () "မှီဝဲခြင်း" နှင့်ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော mode များအကြားခြားနားချက်ကိုအသေးစိတ်ရှင်းပြပါလိမ့်မည်။
Socket_Accept () သည် client များထံမှဆက်သွယ်မှုတောင်းဆိုမှုများကိုလက်ခံသည့် PHP Socket extension တွင် function တစ်ခုဖြစ်သည်။ Socket_create () နှင့် socket_bind () နှင့် socket_listen () socket_listen () socket_listen () socket_listen () socket_listen ()) socket တစ်ခုဖန်တီးပြီးနောက် Socket_Accept () ကို သုံးရန်လိုအပ်သည်။
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
// မှန်သော $client ဖတ်ပြီးစစ်ဆင်ရေးကိုရေးပါ
}
အထက်ပါဥပမာတွင် socket_accept () သည် client ကိုဆက်သွယ်သည်အထိဆက်သွယ်မှုကိုစောင့်ဆိုင်းနေစဉ်ပိတ်ဆို့ခြင်းကိုစောင့်ရှောက်မည်။
"မှီဝဲ" ဟုခေါ်သောသည်အမှန်တကယ်ပရိုဂရမ်သည်ဆက်သွယ်မှုကိုစောင့်ဆိုင်းနေသော်လည်းပြန်မသွားပါ။ ၎င်းသည် bug မဟုတ်ဘဲပိတ်ဆို့ခြင်း mode တွင်ပုံမှန်အပြုအမူတစ်ခုဖြစ်သည်။
ပုံမှန်အားဖြင့် PHP Socket သည်ပိတ်ဆို့ခြင်း mode တွင်ရှိသည်။ အဓိပ်ပါယျမှာ:
0 န်ဆောင်မှုခံယူသူသည်ဆာဗာနှင့်ချိတ်ဆက်ထားခြင်းမရှိပါက socket_accept () စောင့်ဆိုင်းလိမ့်မည်။
CPU သည် Socket_Accept () ရလဒ်ကိုပြန်ပို့သည်အထိနောက်ဆက်တွဲကုဒ်ကိုမလုပ်ဆောင်နိုင်ပါ။
ထို့ကြောင့်သင်သည်ဆာဗာကို debugging သို့မဟုတ် run သောအခါ client client ကိုဆက်သွယ်ခြင်းမရှိဘဲပရိုဂရမ်သည်အမြဲတမ်း "Socket_Accept () လိုင်းတွင်အမြဲတမ်း" ကပ်နေ "လိမ့်မည်။
၎င်းသည်ထုတ်လုပ်မှုပတ် 0 န်းကျင်တွင်လက်ခံနိုင်ဖွယ်ရှိသည်, အကြောင်းမှာဆာဗာသည်ဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်လိုအပ်သည်။ သို့သော် debugging သို့မဟုတ်အလုပ်များစွာကိုင်တွယ်ရန်လိုအပ်သည့်ပတ်ဝန်းကျင်တွင်ဤပိတ်ဆို့ခြင်းသည်ပြ a နာတစ်ခုဖြစ်လာနိုင်သည်။
အကယ်. သင်သည်အစီအစဉ်ကိုဆက်သွယ်မှုမရှိဘဲဆက်လက်လုပ်ဆောင်ရန်သို့မဟုတ်အခြားလုပ်ငန်းများကိုပုံမှန်လုပ်ဆောင်ခြင်းသို့မဟုတ်အခြားအဖြစ်အပျက်များကိုရှာဖွေခြင်းကဲ့သို့သောဆက်သွယ်မှုမရှိဘဲဆက်လက်လုပ်ဆောင်ရန်သင်လိုချင်ပါက ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကို အသုံးပြုရန်လိုအပ်သည်။
socket_set_nonblock($socket);
ဤအချိန်တွင် Socket_Accept () သည် မသေချာသော်လည်းအစား
ဆက်သွယ်မှုတစ်ခုရှိလျှင် client socket သို့ပြန်သွားပါ။
ဆက်သွယ်မှုမရှိသည့်အခါချက်ချင်း မှားယွင်းသော နောက်သို့ ပြန်ပို့ပါ ။
နမူနာကုဒ်:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
socket_set_nonblock($socket);
while (true) {
$client = @socket_accept($socket);
if ($client === false) {
// ဆက်သွယ်မှုမရှိပါ,အခြားအရာများကိုဆက်လုပ်ပါ
echo "ဆက်သွယ်မှုကိုစောင့်ဆိုင်း...\n";
sleep(1);
} else {
// အောင်မြင်စွာ connection ကိုလက်ခံရရှိခဲ့သည်
socket_write($client, "Hello from m66.net\n");
socket_close($client);
}
}
နောက်ထပ်ဘုံအလေ့အကျင့်တစ်ခုမှာ Socket_select () ကိုအသုံးပြုခြင်းသည် SockeSeen () ကို အသုံးပြုရန်ဖြစ်သည်။
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
$client = socket_accept($socket);
// client ဆက်သွယ်မှုကိုကိုင်တွယ်
}
သင်အချိန်ကုန်အချိန်သတ်မှတ်နိုင်သောကြောင့်ဤနည်းလမ်းသည်အကန့်အသတ်မရှိပိတ်ဆို့ခြင်းမရှိပါ။ Socket မျိုးစုံသည်တစ်ချိန်တည်းတွင်နားထောင်နေသည့်မြင်ကွင်းများအတွက်လည်းသင့်တော်သည်။
Socket_Accept () သည်ပုံမှန်အားဖြင့်ပိတ်ဆို့ခြင်းဖြစ်ပြီးဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါက၎င်းသည်စောင့်ဆိုင်းလိမ့်မည်။
အပြုအမူကိုပိတ်ဆို့ခြင်းသည်အမှားအယွင်းတစ်ခုမဟုတ်ပါ,
ပရိုဂရမ်ရပ်တန့်မှုကိုရှောင်ရှားရန် Socket_set_set_nonBlock () ကို ပိတ်ထားခြင်းမပြုရသေးသော mode သို့သတ်မှတ်နိုင်သည်။
ပိုမိုအဆင့်မြင့်သောအဖြေတစ်ခုမှာ Socket မျိုးစုံအခြေအနေကိုစီမံရန် Socket_select () ကို အသုံးပြုရန်ဖြစ်သည်။