လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ရှည်လျားသောဆက်သွယ်မှုမူဝါဒများညှိရန် Socket_set_block ကိုသုံးပါ

ရှည်လျားသောဆက်သွယ်မှုမူဝါဒများညှိရန် Socket_set_block ကိုသုံးပါ

gitbox 2025-05-28

PHP Development တွင်စွမ်းဆောင်ရည်နှင့်တုန့်ပြန်မှုနှုန်းသည်ရှည်လျားသောဆက်သွယ်မှုများကိုကိုင်တွယ်သည့်အခါအဓိကထည့်သွင်းစဉ်းစားမှုများဖြစ်သည်။ PHP default societ socket လုပ်ငန်းလည်ပတ်မှုသည်ပိတ်ဆို့ခြင်းဖြစ်သည်။ ဆိုလိုသည်မှာပရိုဂရမ်သည်စာဖတ်ခြင်းသို့မဟုတ်ရေးခြင်းစစ်ဆင်ရေးကိုခေါ်သည့်အခါ၎င်းသည်စစ်ဆင်ရေးပြီးစီးသည်အထိစောင့်ဆိုင်းလိမ့်မည်။ ဤအဆုံးတွင် Socket_set_set_block function ကို function function ကို အသုံးပြု. PHP Long Connections ၏စွမ်းဆောင်ရည်ကိုထိထိရောက်ရောက်ကောင်းမွန်စေနိုင်သည်။


Socket_set_block ဆိုတာဘာလဲ။

Socket_set_Block သည် Socket Blocking Mode ကိုသတ်မှတ်သည့် PHP တွင်လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ၎င်း၏ရည်ရွယ်ချက်မှာ socket blocking ကိုစောင့်ရှောက်ရန်ဖြစ်သည်။ ပိတ်ဆို့ခြင်း mode တွင်အချက်အလက်များအဆင်သင့်ဖြစ်သည့်အတွက်ဖတ်ရန်သို့မဟုတ်ရေးရန်စစ်ဆင်ရေးသည်မပြန်မီပြီးစီးသည်အထိစာဖတ်ခြင်းသို့မဟုတ်ရေးခြင်းစစ်ဆင်ရေးသည်စောင့်ဆိုင်းလိမ့်မည်။

 bool socket_set_block ( resource $socket )
  • parameter $ socket : blocking mode ကိုသတ်မှတ်ရန် Socket Reusice ။

  • Reward Value: အောင်မြင်မှုအောင်မြင်ပါကအဖြေရှာလျှင် မအောင်မြင် ပါ

ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ရန်အသုံးပြုသော socket_set_set_nonblock နှင့်သက်ဆိုင်သည်။


ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes အကြားခြားနားချက်

  • Blocking Mode : စာဖတ်ခြင်းနှင့်ရေးခြင်းလုပ်ငန်းများကိုလုပ်ဆောင်သောအခါအစီအစဉ်သည်စစ်ဆင်ရေးပြီးစီးသည်အထိသို့မဟုတ်အချိန်ကုန်သက်သာသည်အထိစောင့်ဆိုင်းနေသည်။

  • ပိတ်ဆို့ခြင်းမဟုတ်သော mode : စာဖတ်ခြင်းနှင့်ရေးခြင်းလုပ်ငန်းများကိုဖျော်ဖြေသောအခါအစီအစဉ်သည်ချက်ချင်းပြန်လာပြီးအချက်အလက်မရှိတော့ပါ။

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


Socket_set_sblock ဖြင့် Long Connection Prourport ကိုပိုကောင်းအောင်လုပ်ပါ

ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes များအကြားပိုမိုပြောင်းလဲခြင်းသည် PHP ကိုစွမ်းဆောင်ရည်နှင့်တုန့်ပြန်မှုများကိုရှည်လျားသောဆက်သွယ်မှုများတွင်ထည့်သွင်းစဉ်းစားရန်ခွင့်ပြုသည်။ တိကျသောနည်းဗျူဟာများမှာ -

1 ။ ဆက်သွယ်မှုတစ်ခုတည်ထောင်ပြီးနောက်ဒေတာများကိုစောင့်ဆိုင်းရန်ပထမ ဦး စွာပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသုံးပါ

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

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

2 ။ ပိတ်ဆို့ခြင်းလိုအပ်ကြောင်းဆုံးဖြတ်သည်ဆိုပါကပိတ်ဆို့ခြင်း mode သို့ပြောင်းပါ

ဥပမာအားဖြင့်, fixed-length data ကိုဖတ်ရန်ပြင်ဆင်နေသည့်အခါအချက်အလက်များကိုနဂိုအတိုင်းဖတ်ပြီး packet ကိုဖတ်ရန်နှင့် packet ပြ problems နာများကိုရှောင်ရှားရန်ပိတ်ဆို့ခြင်း mode ကိုသုံးပါ။

 socket_set_block($socket);
$data = socket_read($socket, 1024);

3 ။ Socket_select Socket Socket status ကိုသုံးပါ

Socket_select ကို အသုံးပြု. Socket တွင် detect ကို အသုံးပြု. မမှန်ကန်သောစောင့်ဆိုင်းမှုကိုဖတ်ရန်နှင့်လျှော့ချရန်အချက်အလက်များရှိ,

 $read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
    socket_set_block($socket);
    $data = socket_read($socket, 1024);
    // အချက်အလက်များကိုထုတ်ယူခြင်း
} else {
    // အချိန်ကုန် processing သို့မဟုတ်အခြားယုတ္တိဗေဒ
}

Code Perfect: Socket_set_BLOCK ကို အသုံးပြု. ရှည်လျားသောဆက်သွယ်မှုစာဖတ်ခြင်းကိုအကောင်းဆုံးပြုလုပ်ပါ

 <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}

// Non-blocking ကိုပထမ ဦး ဆုံးထားပါ,stuck အစီအစဉ်ကိုရှောင်ကြဉ်ပါ
socket_set_nonblock($socket);

// တောင်းဆိုမှုကိုပို့ပါ
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: keep-alive\r\n\r\n";
socket_write($socket, $request, strlen($request));

// အသုံးပြု socket_select ဖတ်ရန်အချက်အလက်များကိုစောင့်ပါ
$read = [$socket];
$write = $except = null;
$timeout_sec = 5;

if (socket_select($read, $write, $except, $timeout_sec) > 0) {
    // ဒေတာအဆင်သင့်ဖြစ်လျှင်ပိတ်ဆို့ခြင်း mode ကိုမှ switch,ပြီးပြည့်စုံသောဒေတာကိုဖတ်ပါ
    socket_set_block($socket);
    $response = '';
    while ($out = socket_read($socket, 2048)) {
        $response .= $out;
        if (strlen($out) < 2048) {
            break;
        }
    }
    echo $response;
} else {
    echo "ဒေတာအချိန်ကုန်သို့မဟုတ်ဒေတာအဘယ်သူမျှမဒေတာကိုစောင့်ဆိုင်း";
}

socket_close($socket);
?>

အကျဉ်းချုပ်

  • Socket_set_block သည် socket opercy များကိုပိတ်ဆို့ခြင်း mode ကိုဖွင့်ရန်ခွင့်ပြုသည်။

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

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

အထက်ပါနည်းလမ်းများမှတစ်ဆင့် PHP Long Connection Procession သည်ပိုမိုထိရောက်စွာတည်ငြိမ်ပြီးတည်ငြိမ်သောစွမ်းဆောင်ရည်နှင့်တုံ့ပြန်မှုအချိန်လိုအပ်ချက်များနှင့်အတူကွန်ယက်လျှောက်လွှာအခြေအနေများအတွက်သင့်တော်သည်။