လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> non-blocking sockets အတွက် socket_clear_Error () ကိုအသုံးပြု။ မှတ်စုများ

non-blocking sockets အတွက် socket_clear_Error () ကိုအသုံးပြု။ မှတ်စုများ

M66 2025-05-25

PHP Network Programming တွင်ပိတ်ဆို့ခြင်းမဟုတ်သော Socketets များသည်ပရိုဂရမ်တုန့်ပြန်မှုမြန်နှုန်းနှင့်တစ်ပြိုင်နက်တည်းတိုးတက်စေရန်အသုံးပြုကြသည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကို socket socket socket လုပ်ခြင်းအားဖြင့်အချက်အလက်များကိုစောင့်ဆိုင်းခြင်းကြောင့်အစီအစဉ်ကိုပိတ်ပင်တားဆီးမှုမရှိပါ။ သို့သော်ပိတ်ဆို့ခြင်းမဟုတ်သောပုံစံများလည်းအပိုဆောင်းရှုပ်ထွေးမှုများကိုယူဆောင်လာပြီးအထူးသဖြင့်အရေးပါသောအမှားများကိုကိုင်တွယ်ခြင်းဖြင့်လည်းပိုမိုရှုပ်ထွေးစေသည်။ ဤဆောင်းပါးသည် socket_clear_Error () function ကိုပိတ်ဆို့ခြင်းမဟုတ်သော sockets များကိုမည်သို့မှန်ကန်စွာအသုံးပြုရမည်ကိုအာရုံစိုက်မည်။

Socket_Close_Error ()?

Socket_Close_Error () သည် Socket ပေါ်တွင်ဖြစ်ပွားခဲ့သောအမှားများကိုရှင်းလင်းစေသည့် PHP တွင်လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ၎င်းသည်မကြာခဏဆိုသလိုအမှားအယွင်းများနှင့်အမှားအယွင်းများတွင်ပြန်လည်ပြုပြင်ခြင်းအခြေအနေများတွင်အသုံးပြုသည်။

non-blocking socket ၏ဝိသေသလက္ခဏာများ

ပိတ်ဆို့ခြင်း non-blocking non-socket သည်ခွဲစိတ်ကုသမှုတစ်ခုပြုလုပ်သောအခါလက်ရှိရရှိနိုင်သည့်အချက်အလက်များသို့မဟုတ်အရင်းအမြစ်မရရှိပါကစောင့်ဆိုင်းမည့်အစားချက်ချင်းပြန်လာလိမ့်မည်။ ဤအပြုအမူသည် Eagain သို့မဟုတ် ewouldblock ကဲ့သို့သော "အမှား" ကဲ့သို့သော "အမှား" အချို့ကိုမကြာခဏဖြစ်ပေါ်စေသည်။ ဤကိစ္စတွင်အမှားတစ်ခုကိုတိုက်ရိုက်အစီရင်ခံခြင်းသို့မဟုတ်ဆက်သွယ်မှုကိုပိတ်ရန်သင်တိုက်ရိုက်အစီရင်ခံခြင်းမပြုသင့်ပါ။

socket_clear_error ကိုအသုံးပြုရန်မှန်ကန်သောအချိန် ()

  1. ပြုပြင်ထားသောအမှားများကိုရှင်းလင်းပါ Socket Error Code ကိုရှာဖွေတွေ့ရှိပါကအမှားကိုမှန်ကန်စွာပြုပြင်ပြီးပြီဟုဆုံးဖြတ်ပါက (ဥပမာအားဖြင့် EAGAIN ကို ပြန်လည်ပြုပြင်ရန်နှင့်စောင့်ဆိုင်းခြင်း) သည်နောက်ဆက်တွဲ အမှားများကိုနောက်ဆက်တွဲအမှားများကိုရှောင်ရှားရန်အမှားအယွင်းများကိုပြန်လည်စတင်ရန်တောင်းဆိုသင့်သည်။

  2. အမှားအယွင်းမရှိဘဲခေါ်ဆိုခြင်းမပြုပါနှင့် socket_clear_Error_Error () ကို မကြာခဏခေါ်ဆိုရန်မလိုအပ်ပါ။ သို့မဟုတ်ပါကအမှားအယွင်းများကိုဖုံးကွယ်ထားရန်အကြံပြုခြင်းမဟုတ်ပါ။

  3. Socket_last_Error () <br> အများအားဖြင့် Socket_last_Error () သည် socket ၏အမှားအယွင်းကိုဆုံးဖြတ်ရန်အသုံးပြုသည်။ Socket_Close_Error () အမှားတစ်ခုရှိလျှင်သာဟုခေါ်သည်။

Code Page

 <?php
// ပိတ်ဆို့ခြင်းမဟုတ်သောဖန်တီးပါ Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);

// ဆာဗာကိုဆက်သွယ်ပါ
socket_connect($socket, 'm66.net', 80);

// Non-blocking ဒေတာပေးပို့ခြင်း
$data = "GET / HTTP/1.1\r\nHost: m66.net\r\nConnection: Close\r\n\r\n";

$bytesSent = socket_write($socket, $data);
if ($bytesSent === false) {
    $errCode = socket_last_error($socket);
    if ($errCode == SOCKET_EAGAIN || $errCode == SOCKET_EWOULDBLOCK) {
        // အရင်းအမြစ်များကိုယာယီမရနိုင်ပါ,နောက်မှထပ်ကြိုးစားပါ
        echo "Write would block, try again later.\n";
    } else {
        // အခြားအမှားများ,output အမှားအယွင်းနှင့်ရှင်းလင်းသောအမှားအယွင်း
        echo "Socket write error: " . socket_strerror($errCode) . "\n";
        socket_clear_error($socket);
    }
}

// တုံ့ပြန်မှုကိုဖတ်ပါ
while (true) {
    $buffer = socket_read($socket, 2048);
    if ($buffer === false) {
        $errCode = socket_last_error($socket);
        if ($errCode == SOCKET_EAGAIN || $errCode == SOCKET_EWOULDBLOCK) {
            // ဒေတာကိုယာယီမရနိုင်ပါ,စောင့်ဆိုင်းနေပါ
            usleep(100000); // 100ms
            continue;
        } else {
            echo "Socket read error: " . socket_strerror($errCode) . "\n";
            socket_clear_error($socket);
            break;
        }
    } elseif ($buffer === '') {
        // ဆက်သွယ်မှုပိတ်
        break;
    } else {
        echo $buffer;
    }
}

socket_close($socket);
?>

ဘယ်အချိန်မှာအသုံးပြုတဲ့အခါသတိထားမိရန်ပြ issues နာများ

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

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

  • status ကိုစောင့်ကြည့်ရန်အခြားလုပ်ဆောင်ချက်များနှင့်ပေါင်းစပ်ထားသည် ။ ဥပမာအားဖြင့် socket_last_Error () ကို socket_clast_error () ကို ပိုမိုလုံခြုံစွာစီမံရန်အသုံးပြုသည်။

  • အချိန်ကိုလက်ကိုင်ကိုင်ပြီးယုတ္တိဗေဒကိုကောင်းစွာကြိုးစားပါ ။ ပိတ်ဆို့ခြင်းမဟုတ်သောစစ်ဆင်ရေးများသည်မဲရုံများသို့မဟုတ်အဖြစ်အပျက်များနှင့်အကြိမ်အရေအတွက်ကိုကျိုးကြောင်းဆီလျော်စွာဒီဇိုင်းဆွဲရန်အတွက်ပါ 0 င်ခြင်းသို့မဟုတ်ဖြစ်ရပ်ယန္တရားများနှင့်ပူးပေါင်းဆောင်ရွက်ရန်လိုအပ်သည်။