လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP scription ၏ပြ problem နာကိုဆန်းစစ်ခြင်း socket_set_sblock ကိုအသုံးပြုပြီးနောက်မှီဝဲ

PHP scription ၏ပြ problem နာကိုဆန်းစစ်ခြင်း socket_set_sblock ကိုအသုံးပြုပြီးနောက်မှီဝဲ

gitbox 2025-05-26

Php Socket တွင် procy_set_set_set_block () function ကိုအသုံးပြုသောအခါ Socket ကိုပိတ်ထားရန် socket ကိုသတ်မှတ်ရန်အသုံးပြုသည်။ Blocking Mode ဆိုသည်မှာဖတ်ခြင်း ( socket_read (socket_read () ), ရေးခြင်း ( socket_write () ) သို့မဟုတ် connection ကိုလက်ခံရရှိခြင်း, စာဖြင့်ရေးသားခြင်း, ရေးသည်သို့မဟုတ်ဆက်သွယ်မှုကိုမရောက်မချင်းစောင့်ဆိုင်းလိမ့်မည်။ အကယ်. ၎င်းသည်မရှင်းလင်းပါကအချို့သောအခြေအနေများတွင် socket_set_sblock () တွင် PHP screen တစ်ခုလုံးကို "stagnate" တစ်ခုလုံးကိုဖြစ်ပေါ်စေလိမ့်မည်။

1 ။ Socket_set_set_block () PHP script ကိုဘာကြောင့်မြုပ်စေတာလဲ။

Socket_set_sc_block () ကိုအသုံးပြုပြီးနောက် PHP သည်ပိတ်ဆို့ခြင်း mode ကိုရိုက်ထည့်ပြီး Socket operty ၏ရလဒ်ကိုစောင့်ဆိုင်းလိမ့်မည်။ အကယ်. သက်ဆိုင်ရာအရင်းအမြစ် (ဥပမာအချက်အလက်များသို့မဟုတ်ဆက်သွယ်မှုကဲ့သို့သော) သည်အချိန်ကြာမြင့်စွာမပြန်ပါက PHP script သည်စောင့်နေပြီးနောက်ဆက်တွဲကုဒ်ကိုဆက်လက်လုပ်ဆောင်လိမ့်မည်မဟုတ်ပေ။

ဤတွင်ပုံမှန်ဥပမာတစ်ခုဖြစ်သည်။

 <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
socket_set_block($socket); // mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ

// ဒေတာကိုဖတ်ရန်ကြိုးစားပါ
$response = socket_read($socket, 2048);
echo $response;

socket_close($socket);
?>

အကယ်. ဆာဗာ Gitbox.net သည် အချက်အလက်များကိုချက်ချင်းပြန်ပို့ခြင်းသို့မဟုတ်လုံးဝမတုံ့ပြန်ပါက socket_read () သည် စောင့်နေပြီးဇာတ်ညွှန်းသည် "မှီဝဲ" လိမ့်မည်။ ဤသို့သောနှောင့်နှေးမှုသည်အချိန်ကုန်ယန္တရားကိုအစပျိုးခြင်းမရှိပါကအမှားတစ်ခုမပြုလုပ်နိုင်ပါ, သို့သော်အချိန်ကုန်အချိန်ကိုပုံမှန်အားဖြင့်သတ်မှတ်ခြင်းမရှိပါ။

2 ။ socket_set_sblock () ကြောင့်ဖြစ်ရတဲ့ပိတ်ဆို့ခြင်းပြ problem နာကိုဘယ်လိုဖြေရှင်းရမလဲ။

1 ။ အချိန်ကုန်ထားပါ

ရေရှည်ပိတ်ဆို့ခြင်းကိုတားဆီးရန်အတွက်အချိန်ကုန်အချိန်ကိုသတ်မှတ်ရန် Socket_set_option () ကို သုံးပါ။

 $timeout = ['sec' => 5, 'usec' => 0]; // အဖြစ်သတ်မှတ်5စက်ဏန့်
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);

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

2 ။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသုံးပါ (အကြံပြုထားသောနည်းလမ်း)

အကယ်. သင်သည် script ကိုမပိတ်လိုပါက socket_set_nonblock () ကို သုံးနိုင်သည်။

 socket_set_nonblock($socket);

ကွင်းဆက်နှင့် USEEP () ဖြင့်ပိတ်ဆို့ခြင်းမရှိသောစောင့်ဆိုင်းမှုကို simulated လုပ်နိုင်သည်။

 $buffer = '';
while (true) {
    $chunk = @socket_read($socket, 2048);
    if ($chunk === false) {
        usleep(100000); // အိပ်နေခြင်း100ms
        continue;
    } elseif ($chunk === '') {
        break; // ဆက်သွယ်မှုပိတ်
    } else {
        $buffer .= $chunk;
    }
}

3 ။ Selectable () ဖတ်ပြီးဖတ်နိုင်ပြီးရေးရန်စောင့်ဆိုင်းရန်

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

 $read = [$socket];
$write = NULL;
$except = NULL;
$tv_sec = 5; // အများဆုံးစောင့်ဆိုင်း5စက်ဏန့်

if (socket_select($read, $write, $except, $tv_sec) > 0) {
    $response = socket_read($socket, 2048);
    echo $response;
} else {
    echo "Socket အချိန်ကုန်သို့မဟုတ်အဘယ်သူမျှမဖတ်ရှုနိုင်သောဒေတာ";
}

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

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

Socket_set_Set_Block () ကို အသုံးပြုခြင်းသည်အန္တရာယ်ကင်းမှုမရှိသော်လည်း၎င်း၏အခြေအနေကိုအလွန်ရှင်းလင်းစွာထိန်းချုပ်ရန်လိုအပ်သည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုအသုံးပြုခြင်းသို့မဟုတ်ရှင်းလင်းပြတ်သားစွာပြုလုပ်ရန်အတွက်ကွန်ယက်နှောင့်နှေးမှုနှင့် 0 န်ဆောင်မှုဆိုင်ရာပြ issues နာများကြောင့်အမြဲတမ်းပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်အချိန်ကိုရှင်းလင်းစွာသတ်မှတ်ရန်အကြံပြုသည်။

အချိန်မှန်တုံ့ပြန်မှုသို့မဟုတ်တစ်ပြိုင်နက်တည်းလုပ်ဆောင်ရန်လိုအပ်သည့်ဖြစ်ရပ်များအတွက် socket_set_set_setblock () နှင့် ပေါင်းစပ်ရန်သို့မဟုတ် socket_select () နှင့်ပေါင်းစပ်ရန်သို့မဟုတ် socket_select () နှင့်ပေါင်းစပ်ရန်အကြံပြုသည်။ ၎င်းသည်ပရိုဂရမ်အား 0 င်ရောက်မှုကိုတိုးတက်စေသည်သာမကစနစ်၏တုန့်ပြန်မှုစွမ်းဆောင်ရည်ကိုလည်းများစွာတိုးတက်စေသည်။