လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP တွင် stream_socket_shutdown ကိုဖုန်းခေါ်ဆိုခြင်းသည် connection assocke ပြတ်တောက်စေသည်။ အဲဒါကိုဘယ်လိုရှောင်ရှားနိုင်မလဲ။

PHP တွင် stream_socket_shutdown ကိုဖုန်းခေါ်ဆိုခြင်းသည် connection assocke ပြတ်တောက်စေသည်။ အဲဒါကိုဘယ်လိုရှောင်ရှားနိုင်မလဲ။

M66 2025-06-22

PHP Network Programming တွင် stream_socket_shutdown function ကိုတစ် ဦး ဦး တည်ချက်ကိုပိတ်ထားရန် (ဖတ်, ရေး, ရေး, ရေး, သို့မဟုတ်နှစ် ဦး စလုံး) ကိုပိတ်ရန်အသုံးပြုသည်။ သို့သော်အမှန်တကယ်အသုံးပြုမှုတွင်များစွာသော developer များစွာသည်ပုံမှန်မဟုတ်သောဆက်သွယ်မှုပြတ်တောက်ခြင်း, သုံးစွဲသူများပြတ်တောက်ခြင်း, client justs robsock ား , ဤဆောင်းပါးသည် stream_socket_shutownowns of stream_socket_shutowndowns ၏အလုပ်ယန္တရားကိုဆန်းစစ်ကြည့်ရှုလိမ့်မည်, ဆက်စပ်ခြွင်းချက်များ၏အကြောင်းရင်းများကိုစူးစမ်းလေ့လာပါလိမ့်မည်။


1 ။ stream_socket_shutdown ၏အခြေခံအသုံးပြုမှု

stream_socket_shutdown ရဲ့ function ကတော့အောက်ပါအတိုင်းဖြစ်သည် -

 bool stream_socket_shutdown(resource $stream, int $how)
  • $ stream : Open Socket Stream သယံဇာတအရင်းအမြစ်။

  • $ ဘယ်လို - ဦး တည်ချက်ကိုပိတ်ပါ, တန်ဖိုးကိုယူပါ။

    • Steam_shut_rd (0) စာဖတ်ခြင်းလမ်းညွှန်ကိုပိတ်ပါ

    • Steam_shut_wr (1) Write လမ်းညွှန်ကိုပိတ်ပါ

    • Stream_shut_rdwr (2) ဖတ်ပြီးလမ်းညွှန်များကိုပိတ်ပါ

ဥပမာအားဖြင့်:

 $socket = stream_socket_client("tcp://m66.net:8080", $errno, $errstr, 30);
if (!$socket) {
    die("ဆက်သွယ်မှုမအောင်မြင်ပါ: $errstr ($errno)");
}

// အရေးအသား ဦး တည်ချက်ကိုပိတ်ပါ,ဒေတာကိုမရှိတော့ကြောင်းဖော်ပြသည်
stream_socket_shutdown($socket, STREAM_SHUT_WR);

stream_socket_shutdown ကိုခေါ်ပြီးနောက် Socket ၏လမ်းကြောင်းကိုပိတ်ထားပြီး kernel သည် connection ကိုပိတ်ထားကြောင်းဖော်ပြသည်။


2 ။ stream_socket_shutdown ကို ဘာလို့ဆက်သွယ်မှုကိုအဘယ်ကြောင့်ဆိုသနည်း။

ခြွင်းချက်၏အဓိကအကြောင်းရင်းမှာ stream_socket_shutownown ကို အသုံးပြုသောအခါ client သို့မဟုတ် server သည် connection ၏ shutdown signal ကိုမှန်ကန်စွာကိုင်တွယ်နိုင်ခြင်းမရှိသေးသော်လည်းပိတ်ပွဲအမိန့်သည်မသင့်လျော်ပါ။ အထူးသဖြင့်ထင်ရှားသည်:

  • Transline Dire ကိုကြိုတင်ပိတ်ပါ။

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

  • Write လမ်းညွှန်ကိုပိတ်ပြီးနောက်ကျန်အချက်အလက်များကိုအချိန်မီဖတ်ခြင်းမဟုတ်ပါ ။ ပုံမှန်မဟုတ်သောဆက်သွယ်မှုတစ်ခုဖြစ်ပေါ်စေသည်။

  • Fin packet ကိုသက်တူရွယ်တူများကမအောင်မြင်ပါ။ အချိန်ကုန်ခြင်းနှင့်အဆက်ဖြတ်ခြင်းနှင့်ဆက်စပ်မှုကိုဖြစ်ပေါ်စေသည်

ဤပြ problems နာများသည် TCP Long Connection သို့မဟုတ် Duplex ဆက်သွယ်ရေးအခြေအနေများတွင်အထူးသဖြင့်ဖြစ်ပေါ်လေ့ရှိသည်။


3 ။ stream_socket_shutdown ကိုဘယ်လိုရှောင်ရှားရမလဲ။

3.1 ကျိုးကြောင်းဆီလျော်ပိတ်ခြင်းကိုရွေးချယ်ပါ

သင်ဒေတာများကိုသာပို့။ ထပ်မံရေးရန်မစီစဉ်ပါကခေါ်ဆိုပါ။

 stream_socket_shutdown($socket, STREAM_SHUT_WR);

ဆိုလိုသည်မှာရေးရန် ဦး တည်ချက်ကိုပိတ်ထားသော်လည်းစာဖတ်ခြင်းလမ်းကြောင်းကိုဆက်လက်ထိန်းသိမ်းထားဆဲဖြစ်သည်။

ဆာဗာနှင့် client နှစ် ဦး စလုံးသည်ပထမ ဦး ဆုံးရေးသားထားသောလမ်းကြောင်းကို ဦး စားပေးရန်လိုလျှင်သက်တူရွယ်တူသည်ကျန်ရှိသောအချက်အလက်များကိုဖတ်ရန်အချိန်အလုံအလောက်ရှိကြောင်းသေချာပါစေ။

3.2 အရေးအသား ဦး တည်ချက်ကိုပိတ်ပြီးနောက်အချက်အလက်များကိုဆက်လက်ဖတ်ရှုပါ

Write လမ်းညွှန်ကိုပိတ်ပြီးသည့်နောက်တွင်ဆက်သွယ်မှုသည်အချက်အလက်များကိုဆက်လက်ဖတ်ရှုနိုင်သည်။ အထွေထွေချဉ်းကပ်မှုမှာ -

 // အရေးအသား ဦး တည်ချက်ကိုပိတ်ပါ
stream_socket_shutdown($socket, STREAM_SHUT_WR);

// ရွယ်တူချင်းဒေတာကိုဖတ်ရှုရန်ဆက်လက်EOF
while (!feof($socket)) {
    $data = fread($socket, 8192);
    if ($data === false) {
        break;
    }
    // အချက်အလက်များကိုထုတ်ယူခြင်း
}

အဘယ်သူမျှမအမွေဒေတာကိုမဖတ်ပါစေနှင့်

3.3 Connection ပိတ်ခြင်းအမိန့်မှန်ကန်ကြောင်းသေချာပါစေ

  • ပထမ ဦး စွာအရေးအသား ဦး တည်ချက်ကိုပိတ်ပြီးပို့မည့်ရွယ်တူချင်းအချက်အလက်များကိုအကြောင်းကြားပါ။

  • ရွယ်တူချင်းပြန်လာနိုင်သည့်အချက်အလက်များကိုဖတ်ပါ။

  • စာဖတ်ပြီးနောက်, စာဖတ်ခြင်းလမ်းညွှန်ကိုပိတ်ပါသို့မဟုတ်ဆက်သွယ်မှုတစ်ခုလုံးကိုပိတ်ပါ။

3.4 ကျိုးကြောင်းဆီလျော်သောအချိန်ကုန်ခြင်းနှင့်ခြွင်းချက်ဖမ်းယူပါ

connection connects ကိုပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်အချိန်ကိုဖတ်ရန်အချိန်ကိုဖတ်ရန်အချိန်ကိုဖတ်ရန် TimeT_set_timeout ကို အသုံးပြုပါ။


4 ။ Connection ခြွင်းချက်များအတွက်ဘုံပြင်ဆင်မှုများဥပမာ

အောက်ပါဥပမာသည်ဆာဗာရှိလုံခြုံစိတ်ချရသောဆက်သွယ်မှုကိုရေးရန်မှန်ကန်သောနည်းလမ်းကိုပြသသည်။

 $server = stream_socket_server("tcp://0.0.0.0:12345", $errno, $errstr);
if (!$server) {
    die("ဆာဗာကိုမစတင်နိုင်ပါ: $errstr ($errno)");
}

$client = stream_socket_accept($server);
if ($client) {
    // တုံ့ပြန်မှုဒေတာပေးပို့ပါ
    fwrite($client, "Hello from server\n");

    // အရေးအသား ဦး တည်ချက်ကိုပိတ်ပါ,အချက်အလက်မရှိတော့တဲ့ client ကိုအကြောင်းကြားပါ
    stream_socket_shutdown($client, STREAM_SHUT_WR);

    // client ကိုမှပေးပို့သောအချက်အလက်များကိုဆက်လက်ဖတ်ရှုပါ
    while (!feof($client)) {
        $data = fread($client, 8192);
        if ($data === false || $data === "") {
            break;
        }
        echo "client ကိုဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
    }

    // ဆက်သွယ်မှုကိုပိတ်ပါ
    fclose($client);
}

fclose($server);

5 ။ အခြားကြိုတင်ကာကွယ်မှုများ

  • စာဖတ်ခြင်းကိုမဖွင့်ပါနှင့်ဆက်သွယ်ရေးမရှိတော့ကြောင်းမသေချာပါကမသေချာပါနှင့်။

  • ရှည်လျားသောဆက်သွယ်မှုများအတွက်, stream_socket_shutdown ကို မကြာခဏခေါ်ဆိုရန်မကြာခဏခေါ်ဆိုမှုကိုရှောင်ကြဉ်ပါ။

  • client နှင့် server ၏ protocol ဒီဇိုင်းသည် connection ပိတ်ခြင်း၏အချိန်နှင့်အမိန့်အကြောင်းသေချာစေရန်သေချာပါစေ။

  • ပိတ်ဆို့ခြင်းကိုကာကွယ်ရန် Stream_set_set_set_set_timeout ကို သုံးပါ။


အကျဉ်းချုပ်

Steam_socket_shutdown သည် socket connection များကိုပိတ်ခြင်းအတွက်အရေးကြီးသောကိရိယာတစ်ခုဖြစ်သည်။ သို့သော်မသင့်လျော်သောအသုံးပြုမှုသည်ပုံမှန်မဟုတ်သောဆက်သွယ်မှုပြတ်တောက်မှုများကိုအလွယ်တကူ ဦး တည်သွားနိုင်သည်။ ၎င်း၏ပိတ်ပစ်မှု၏ semantics ကိုနားလည်ခြင်း, ပိတ်ခြင်းလမ်းကြောင်းကိုကျိုးကြောင်းဆီလျော်စွာရွေးချယ်ခြင်းနှင့်ပိတ်ခြင်းပြီးနောက်အချက်အလက်များ၏စာဖတ်ခြင်းနှင့်ရေးသားခြင်းအမိန့်ကိုသေချာစေရန်ပြ problems နာများကိုရှောင်ရှားရန်နှင့်ဖြေရှင်းရန်သော့ချက်ဖြစ်သည်။ မှန်ကန်သောအချိန်သတ်မှတ်ချက်များနှင့်ခြွင်းချက်ကိုင်တွယ်ခြင်းနှင့်ခြွင်းချက်ကိုင်တွယ်ခြင်းက PHP ကွန်ယက်အစီအစဉ်များကိုပိုမိုတည်ငြိမ်ပြီးယုံကြည်စိတ်ချရစေနိုင်သည်။