လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_Accept () မှီဝဲ? ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes အကြားကွဲပြားခြားနားမှု၏ကွဲပြားခြားနားမှု၏အသေးစိတ်ရှင်းပြချက်

Socket_Accept () မှီဝဲ? ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes အကြားကွဲပြားခြားနားမှု၏ကွဲပြားခြားနားမှု၏အသေးစိတ်ရှင်းပြချက်

M66 2025-05-20

Network Programming အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ TCP ဆာဗာတစ်ခုကိုဖန်တီးရန် Developmer_Accept ()) ကို အသုံးပြုသောအခါ developer_Accept () ကိုအသုံးပြုသည့်အခါပြ a နာတစ်ခုမှာပြ a နာတစ်ခုဖြစ်လေ့ရှိသည်။ ဤဖြစ်စဉ်သည်အများအားဖြင့် "ပိတ်ဆို့ခြင်း mode" နှင့် "ပိတ်ဆို့ခြင်းမရှိသော mode" ကိုမလုံလောက်ခြင်းမှအများအားဖြင့်အဓိကအားဖြင့်အဓိကအားဖြင့်အဓိကထားသည်။ ဤဆောင်းပါးသည်အဘယ်ကြောင့် Socket_Accept () "မှီဝဲခြင်း" နှင့်ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော mode များအကြားခြားနားချက်ကိုအသေးစိတ်ရှင်းပြပါလိမ့်မည်။

1 ။ Socket_Accept ကဘာလဲ။

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 ကိုဆက်သွယ်သည်အထိဆက်သွယ်မှုကိုစောင့်ဆိုင်းနေစဉ်ပိတ်ဆို့ခြင်းကိုစောင့်ရှောက်မည်။

2 ။ အဘယ်ကြောင့် "စွဲကပ်" နေတာလဲ

"မှီဝဲ" ဟုခေါ်သောသည်အမှန်တကယ်ပရိုဂရမ်သည်ဆက်သွယ်မှုကိုစောင့်ဆိုင်းနေသော်လည်းပြန်မသွားပါ။ ၎င်းသည် bug မဟုတ်ဘဲပိတ်ဆို့ခြင်း mode တွင်ပုံမှန်အပြုအမူတစ်ခုဖြစ်သည်။

ပုံမှန်အားဖြင့် PHP Socket သည်ပိတ်ဆို့ခြင်း mode တွင်ရှိသည်။ အဓိပ်ပါယျမှာ:

  • 0 န်ဆောင်မှုခံယူသူသည်ဆာဗာနှင့်ချိတ်ဆက်ထားခြင်းမရှိပါက socket_accept () စောင့်ဆိုင်းလိမ့်မည်။

  • CPU သည် Socket_Accept () ရလဒ်ကိုပြန်ပို့သည်အထိနောက်ဆက်တွဲကုဒ်ကိုမလုပ်ဆောင်နိုင်ပါ။

ထို့ကြောင့်သင်သည်ဆာဗာကို debugging သို့မဟုတ် run သောအခါ client client ကိုဆက်သွယ်ခြင်းမရှိဘဲပရိုဂရမ်သည်အမြဲတမ်း "Socket_Accept () လိုင်းတွင်အမြဲတမ်း" ကပ်နေ "လိမ့်မည်။

၎င်းသည်ထုတ်လုပ်မှုပတ် 0 န်းကျင်တွင်လက်ခံနိုင်ဖွယ်ရှိသည်, အကြောင်းမှာဆာဗာသည်ဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်လိုအပ်သည်။ သို့သော် debugging သို့မဟုတ်အလုပ်များစွာကိုင်တွယ်ရန်လိုအပ်သည့်ပတ်ဝန်းကျင်တွင်ဤပိတ်ဆို့ခြင်းသည်ပြ a နာတစ်ခုဖြစ်လာနိုင်သည်။

3 ။ ပိတ်ဆို့ခြင်း mode ကိုများအတွက်ဖြေရှင်းချက်

အကယ်. သင်သည်အစီအစဉ်ကိုဆက်သွယ်မှုမရှိဘဲဆက်လက်လုပ်ဆောင်ရန်သို့မဟုတ်အခြားလုပ်ငန်းများကိုပုံမှန်လုပ်ဆောင်ခြင်းသို့မဟုတ်အခြားအဖြစ်အပျက်များကိုရှာဖွေခြင်းကဲ့သို့သောဆက်သွယ်မှုမရှိဘဲဆက်လက်လုပ်ဆောင်ရန်သင်လိုချင်ပါက ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကို အသုံးပြုရန်လိုအပ်သည်။

ပိတ်ဆို့ခြင်းမဟုတ်သော 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);
    }
}

4 ။ socket_select () ကို ပိုမိုကောင်းမွန်သောပိတ်ဆို့ခြင်းကိုစီမံရန်အသုံးပြုပါ

နောက်ထပ်ဘုံအလေ့အကျင့်တစ်ခုမှာ Socket_select () ကိုအသုံးပြုခြင်းသည် SockeSeen () ကို အသုံးပြုရန်ဖြစ်သည်။

 $read = [$socket];
$write = $except = null;

if (socket_select($read, $write, $except, 5) > 0) {
    $client = socket_accept($socket);
    // client ဆက်သွယ်မှုကိုကိုင်တွယ်
}

သင်အချိန်ကုန်အချိန်သတ်မှတ်နိုင်သောကြောင့်ဤနည်းလမ်းသည်အကန့်အသတ်မရှိပိတ်ဆို့ခြင်းမရှိပါ။ Socket မျိုးစုံသည်တစ်ချိန်တည်းတွင်နားထောင်နေသည့်မြင်ကွင်းများအတွက်လည်းသင့်တော်သည်။

5 ။ အကျဉ်းချုပ်

  • Socket_Accept () သည်ပုံမှန်အားဖြင့်ပိတ်ဆို့ခြင်းဖြစ်ပြီးဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါက၎င်းသည်စောင့်ဆိုင်းလိမ့်မည်။

  • အပြုအမူကိုပိတ်ဆို့ခြင်းသည်အမှားအယွင်းတစ်ခုမဟုတ်ပါ,

  • ပရိုဂရမ်ရပ်တန့်မှုကိုရှောင်ရှားရန် Socket_set_set_nonBlock () ကို ပိတ်ထားခြင်းမပြုရသေးသော mode သို့သတ်မှတ်နိုင်သည်။

  • ပိုမိုအဆင့်မြင့်သောအဖြေတစ်ခုမှာ Socket မျိုးစုံအခြေအနေကိုစီမံရန် Socket_select () ကို အသုံးပြုရန်ဖြစ်သည်။