လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_set_Set_Blocking တွင်အပြုအမူကိုပိတ်ဆို့ခြင်း

Socket_set_Set_Blocking တွင်အပြုအမူကိုပိတ်ဆို့ခြင်း

gitbox 2025-05-28

PHP Network Programming, Socket_set_set_scking () တွင် Socket သည်ပိတ်ဆို့ခြင်းပုံစံဖြင့်ထိန်းချုပ်သည်ကိုထိန်းချုပ်သောသော့ချက်ဖြစ်သည်။ ၎င်း၏အပြုအမူကိုနားလည်ခြင်းနှင့် debugging ကျွမ်းကျင်မှုများကိုကျွမ်းကျင်စွာကျွမ်းကျင်မှုပြုခြင်းသည်တည်ငြိမ်။ ယုံကြည်စိတ်ချရသောကွန်ယက်အက်ပလီကေးရှင်းများဖွံ့ဖြိုးရန်အတွက်အလွန်အရေးကြီးသည်။ ဤဆောင်းပါးသည် Socket_set_set_Set_Locking () ၏ပိတ်ဆို့ခြင်းအပြုအမူကို debug လုပ်ပြီးလက်တွေ့ကျသောအကြံဥာဏ်များနှင့်အသေးစိတ်ခြေလှမ်းများကိုအသေးစိတ်ရှင်းပြပါမည်။

1 ။ အခြေခံသုံးသပ်ချက် - ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းသည်အဘယ်အရာကိုပိတ်ဆို့ခြင်း,

PHP Socket လုပ်ဆောင်ချက်များကိုအသုံးပြုသောအခါပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းအကြားခြားနားချက်မှာ -

  • Blocking Mode : socket_read () နှင့် socket_accept ()) လုပ်ငန်းဆောင်တာများ () focks () ကိုခေါ်သည့်အခါအချက်အလက်များဖတ်လို့မရလျှင်လုပ်ငန်းစဉ်သည်ချိတ်ဆက်ပါလိမ့်မည်သို့မဟုတ်ဆက်သွယ်မှုတောင်းဆိုမှုတစ်ခုရှိသည်။

  • ပိတ်ဆို့ခြင်းမဟုတ်သော mode : ဤလုပ်ဆောင်ချက်များကိုခေါ်ဆိုခြင်းသို့မဟုတ်ဆက်သွယ်မှုတောင်းဆိုခြင်းမရှိပါက function ကိုချက်ချင်းပြန်လာလိမ့်မည်, များသောအားဖြင့် မှားယွင်းသောအမှားများကို ပြန်ပို့ခြင်းနှင့် socket_last_Error () ကိုပြန်ပို့ပါ။

2 ။ socket_set_sc.blocking ကိုဘယ်လိုသုံးရမလဲ ()

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);

// mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ
socket_set_blocking($socket, true);

ဤအချိန်တွင်, အကယ်. သင်သည် Socket_read_read () ခေါ်ဆိုမှုကို execute လုပ်လျှင်ဒေတာပြန်ရောက်သည်အထိစောင့်ဆိုင်းလိမ့်မည်။

ပိတ်ဆို့ခြင်းမဟုတ်သောရန်သတ်မှတ်ရန်

 socket_set_blocking($socket, false);

3 ။ ပိတ်ဆို့ခြင်းအပြုအမူ debugging အတွက်အဓိကကျွမ်းကျင်မှု

1 ။ Socket_select () နှင့်သုံးပါ။

ပိတ်ဆို့ခြင်းမဟုတ်သည့်အခါသင်ဖတ်နိုင်သော / NOWNIDE ကိုရှာဖွေရန် Socket_select () ကိုသုံးနိုင်သည်။

 $read = [$socket];
$write = $except = null;
$changed = socket_select($read, $write, $except, 5); // ခဏပွဲရပ်ခြင်း 5 စက်ဏန့်

if ($changed > 0) {
    $data = socket_read($socket, 1024);
    echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
} else {
    echo "等待ခဏပွဲရပ်ခြင်း,未ဒေတာကိုလက်ခံရရှိခဲ့သည်\n";
}

ဤနည်းလမ်းသည်ပိတ်ဆို့ခြင်းအပြုအမူကိုဖျက်သိမ်းရန်လည်းသင့်လျော်သည်။ ပိတ်ဆို့ခြင်း mode မှာ Socket_select () သည် ပိတ်ဆို့ခြင်းသည်မျှော်လင့်ထားသည့်အတိုင်းဆုံးဖြတ်ရန်လည်းဆုံးဖြတ်ရန်ကူညီနိုင်သည်။

2 ။ stream_socket_client_client ကိုသုံးပါ

အားလုံးအခြေအနေများတွင်မရှိသော်လည်း stream_socket_cletient () သည် အလားတူထိန်းချုပ်မှုနည်းလမ်းများကိုပေးသည်။

 $fp = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
stream_set_blocking($fp, true);
// သို့မဟုတ်အသုံးပြုပါ stream_set_blocking($fp, false); Non- ပိတ်ဆို့ခြင်းကိုသတ်မှတ်

မတူကွဲပြားသော settings များအောက်တွင်တုန့်ပြန်မှုအပြုအမူကိုနှိုင်းယှဉ်ခြင်းအားဖြင့်ပြ problem နာကိုထိထိရောက်ရောက်တည်ရှိနိုင်သည်။

3 ။ ဆာဗာဘေးထွက်တုံ့ပြန်မှုနှောင့်နှေးမှုကို Simulate

ပိတ်ဆို့ခြင်းအပြုအမူကို debugging လုပ်တဲ့အခါ, docked server ကချက်ချင်းတုန့်ပြန်လျှင်, ပိတ်ဆို့ခြင်းသည်ယာယီဆာဗာတစ်ခုတည်ဆောက်ခြင်းဖြင့် (Python or Php) ကိုတည်ဆောက်ခြင်းနှင့်နှောင့်နှေးခြင်းများကိုထည့်သွင်းခြင်းအားဖြင့်ထိရောက်ကြောင်းအတည်ပြုနိုင်သည်။

ဥပမာအားဖြင့် server-side code သည်တမင်တကာနှောင့်နှေးသည်။

 $client = socket_accept($serverSocket);
sleep(10); // Simulation ပိတ်ဆို့ခြင်း
socket_write($client, "Hello after delay");

client သည်ဤကာလကိုပိတ်ဆို့ခြင်း mode တွင်စောင့်ဆိုင်းသင့်ပြီးပိတ်ဆို့ခြင်းမဟုတ်သောအတွက်ချက်ချင်းပြန်လာပါလိမ့်မည်။

4 ။ အရန်ဆင့်မှတ်တမ်းများနှင့်အမှားကုဒ်များကို debugging

Socket_Last_Error () နှင့် Socket_Stror () ကိုအသုံးပြုခြင်းသည်ပိတ်ဆို့ခြင်းပြ problems နာများကိုပိုမိုရှင်းလင်းစွာနေရာချထားနိုင်သည်။

 if ($data === false) {
    $error = socket_last_error($socket);
    echo "အမှားကုဒ်: $error,ဖေါ်ပြ: " . socket_strerror($error);
}

Eagain , Ewouldblock စသည်တို့စသည့်ပုံမှန်အမှားများစသည်တို့ဖြစ်သည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်ဖတ်ရန်ကြိုးစားသောအခါဖတ်ရန်အချက်အလက်များမရှိပါ။

5 ။ Debugging ကာလအတွင်းမှားယွင်းသောအယူအဆများရှောင်ရှား

  • ပိတ်ဆို့ခြင်းအခြေအနေကိုမှားယွင်းစွာချိန်ညှိခြင်း - ဆက်သွယ်မှုမစတင်မီပိတ်ဆို့ခြင်းသည်ချိတ်ဆက်ခြင်းမရှိသေးပါ။ ဆက်သွယ်မှုပြီးနောက် setting ကဲ့သို့မကောင်းပါ။

  • Socket_select ၏ thinoutout parameter ကိုပျောက်ဆုံးခြင်း () - default သည် default သည်ပိတ်ဆို့ရန်နှင့်စောင့်ဆိုင်းရန်ဖြစ်သည်။ အကယ်. debugging လုပ်နေစဉ်အတွင်းအချိန်ကုန်မသတ်မှတ်ပါက Socket သည်ကပ်နေကြောင်းမှားယွင်းစွာထင်လိမ့်မည်။

  • unprocessed return value : ပိတ်ဆို့ခြင်းအပြုအမူကို debugging လုပ်တဲ့အခါပြန်လာတဲ့တန်ဖိုးကိုလျစ်လျူရှုတဲ့အခါ function ကိုပိတ်ဆို့ထားခြင်းရှိမရှိဆုံးဖြတ်ရန်မဖြစ်နိုင်ဘူး။

6 ။ နိဂုံးချုပ်

socket_set_set_blocking () ၏ပိတ်ဆို့ခြင်းအပြုအမူကိုနားလည်ခြင်းနှင့်မှန်ကန်စွာ debugging လုပ်ခြင်းသည် PHP Socket Programming ကိုကျွမ်းကျင်ရန်အရေးကြီးသောအပိုင်းဖြစ်သည်။ ကျိုးကြောင်းဆီလျော်စွာ socket_select ()) , သစ်ထုတ်လုပ်ခြင်းနှင့်ခြင်း simulation စမ်းသပ်မှုများကိုအသုံးပြုပြီးကွန်ယက်ပရိုဂရမ်များ၏ကွပ်မျက်ခြင်းနှင့်တုန့်ပြန်မှုများကိုထိရောက်စွာထိန်းချုပ်နိုင်ပြီးစနစ်၏ကြံ့ခိုင်မှုနှင့်တုန့်ပြန်မှုစွမ်းဆောင်ရည်ကိုပိုမိုထိရောက်စွာထိန်းချုပ်နိုင်သည်။ ဤဆောင်းပါးတွင်ဖော်ပြထားသောသိကောင်းစရာများနှင့်အဆင့်များသည်အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုအတွက်သင်ပိုမိုအသုံးဝင်သည်ကိုကျွန်ုပ်မျှော်လင့်ပါသည်။