လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> socket_set_sblock ပြီးနောက် Socket အပြုအမူကို debug လုပ်နည်း

socket_set_sblock ပြီးနောက် Socket အပြုအမူကို debug လုပ်နည်း

gitbox 2025-05-29

1 ။ Socket_set_block အကျဉ်းချုပ်ဖော်ပြချက်

Socket_set_block သည် PHP Socket Extension မှပေးသော function တစ်ခုဖြစ်သည်။

 bool socket_set_block ( resource $socket )

Blocking Mode ဆိုသည်မှာ Socket_read , Socket_write စသည့် function ကိုဆိုလိုသည်။ ဒေတာကိုဖတ်လို့မရသောသို့မဟုတ်ရေးသားခြင်းသည်အထိလုပ်ဆောင်မှုကိုပိတ်ဆို့ခြင်းကိုဆိုလိုသည်။


2 ။ ပိတ်ဆို့ခြင်း socket တစ်ခုကို debug လုပ်ဖို့ဘာကြောင့်လိုအပ်ရတာလဲ။

  • ပိတ်ဆို့ခြင်း mode တွင် program သည် function call တစ်ခုတွင်ရပ်တန့်ပြီးလျှောက်လွှာကိုတုန့်ပြန်စရာမလိုပါ။

  • ပိတ်ဆို့ခြင်းအပြုအမူကိုနားလည်ခြင်းအပြုအမူသည်ထောင်ချောက်များသို့မဟုတ်ကြာမြင့်စွာစောင့်ဆိုင်းနေသောပြ issues နာများကိုနေရာချထားပေးသည်။

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


3 ။ အတွေးအခေါ်များနှင့်နည်းလမ်းများကို debugging

3.1 Debugging ကိုကူညီရန်အချိန်ကုန်ချိန်ညှိချက်များကိုအသုံးပြုပါ

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

 // ဖတ်ရန်အချိန်ကုန်ကိုသတ်မှတ်ပါ5စက်ဏန့်,အချိန်ကိုရေးပါ5စက်ဏန့်
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);

3.2 Debug မှတ်တမ်းများကိုမှတ်တမ်းတင်ခြင်း

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

 echo "ဒေတာကိုဖတ်ရှုဖို့အဆင်သင့်...\n";
$data = socket_read($socket, 1024);
if ($data === false) {
    echo "ဖတ်ရန်မအောင်မြင်ပါ,အမှား:" . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "အောင်မြင်စွာဖတ်ပါ,ကေြနပ်သော:" . $data . "\n";
}

3.3 ဖတ်နိုင်ရန်နှင့်စာရေးရန် status ကို detect လုပ်ရန် socket_select ကို သုံးပါ

ပိတ်ဆို့ခြင်း mode မှာ, socket operable ရှိမရှိမသေချာပါကသင် status ကိုဆုံးဖြတ်ရန် Socket_select ကို ပထမ ဦး ဆုံးအသုံးပြုနိုင်ပါတယ်။

 $read = [$socket];
$write = null;
$except = null;
$tv_sec = 10; // 10စက်ဏန့်ခဏပွဲရပ်ခြင်း

$result = socket_select($read, $write, $except, $tv_sec);
if ($result === false) {
    echo "select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်:" . socket_strerror(socket_last_error()) . "\n";
} elseif ($result === 0) {
    echo "select ခဏပွဲရပ်ခြင်း,ဖတ်ရန်အချက်အလက်မရှိပါ\n";
} else {
    echo "socket ဖတ်နိုင်သော,ဒေတာကိုဖတ်ရှုဖို့အဆင်သင့်\n";
    $data = socket_read($socket, 1024);
    echo "读取ကေြနပ်သော:" . $data . "\n";
}

4 ။ အမှန်တကယ်ဥပမာ - ပိတ်ဆို့ခြင်းနှင့် debug ဖတ်ခြင်း

အောက်ပါဥပမာသည် client socket တစ်ခုကိုဖန်တီးနည်းကိုပြသသည်။ client socket mode ကိုဖန်တီးရန်, အချိန်ကုန်များနှင့်မှတ်တမ်းများကိုပေါင်းစပ်။ မှတ်တမ်းများနှင့် socket ၏ debug ကို။

 <?php
// ဖန်တီး TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create ဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}

// ဆာဗာကိုဆက်သွယ်ပါ(ဒီမှာအသုံးပြုခဲ့သည် gitbox.net ဥပမာဒိုမိန်းအမည်အဖြစ်)
$server = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $server, $port)) {
    die("socket_connect ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ
if (!socket_set_block($socket)) {
    die("socket_set_block ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "blocking mode ကိုသတ်မှတ်ထားသည်\n";

// 设置接收ခဏပွဲရပ်ခြင်း5စက်ဏန့်,အဆုံးမဲ့ပိတ်ဆို့မှုကိုရှောင်ကြဉ်ပါ
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);

// ပေးပို့ HTTP GET မေးမြန်း
$request = "GET / HTTP/1.1\r\nHost: $server\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request);

echo "မေးမြန်း已ပေးပို့,တုံ့ပြန်မှုကိုစတင်ဖတ်ပါ...\n";

// တုံ့ပြန်မှုဒေတာကိုဖတ်ပါ
$response = '';
while (true) {
    $buf = socket_read($socket, 2048);
    if ($buf === false) {
        echo "读取အမှား: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($buf === '') {
        // အဝေးမှဆက်သွယ်မှုကိုပိတ်ပါ
        echo "ဝေးလံခေါင်သီဆက်သွယ်မှုပိတ်ထားသည်\n";
        break;
    }
    $response .= $buf;
}

echo "响应ကေြနပ်သော:\n";
echo $response;

socket_close($socket);
?>

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

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

  • အချိန်ကုန်ခံချိန်ညှိချက်များနှင့်မှတ်တမ်း output များကိုပေါင်းစပ်ပြီး debugging ကိုကူညီနိုင်သည်။

  • Socket_select ကို အသုံးပြုခြင်း Socket Status ကိုဆုံးဖြတ်ရန် Socket_select ကိုအသုံးပြုခြင်းသည် debugging နှင့် control တို့ကိုတိုးတက်စေနိုင်သည်။

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

အထက်ဖော်ပြပါနည်းလမ်းများမှတဆင့်ပိတ်ဆို့ခြင်း mode တွင် socket building mode တွင် socket building သည် network conferencer ၏တည်ငြိမ်မှုနှင့်ယုံကြည်စိတ်ချရမှုကိုသေချာစေရန်ထိရောက်စွာ debugged လုပ်နိုင်သည်။