လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> အမှားကုဒ်ကိုဘယ်လိုဖမ်းရမလဲ။

အမှားကုဒ်ကိုဘယ်လိုဖမ်းရမလဲ။

M66 2025-05-22

Socket-based ပရိုဂရမ်အတွက် PHP ကိုအသုံးပြုသည့်အခါ PHP ကိုအသုံးပြုသောအခါဖောက်သည်များ၏ဆက်သွယ်မှုများကိုလက်ခံသည့်သော့ချက်ဖြစ်သည်။ သို့သော် function ခေါ်ဆိုမှုမအောင်မြင်ပါကအမှားတစ်ခုကိုပစ်ချခြင်း, ထို့ကြောင့်, ဤအမှားများကိုဖမ်းခြင်းနှင့်၎င်းတို့အားမှတ်တမ်းတွင်မှတ်တမ်းတင်ခြင်းများကိုမှတ်တမ်းတင်ခြင်းနှင့်ပြုပြင်ခြင်းနှင့်ပြုပြင်ထိန်းသိမ်းခြင်းအတွက်အလွန်လိုအပ်သည်။

ဤဆောင်းပါးသည် socket_acception ၏အမှားများကိုမည်သို့ပြုလုပ်နိုင်ပြီး log file ထဲသို့ 0 င်ရောက်ရန်မည်သို့အသေးစိတ်ဖော်ပြထားသည်။

အခြေခံဥပမာများ

ဤတွင်အခြေခံ Socket Server ဥပမာတစ်ခုမှာ -

 <?php

$host = '0.0.0.0';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    error_log("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_bind($socket, $host, $port)) {
    error_log("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_listen($socket, 5)) {
    error_log("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

catch socket_accept () အမှား

Socket_Accept () သည် ပျက်ကွက်မှုအပေါ် မှားယွင်းစွာ တုံ့ပြန်လိမ့်မည်။ အမှားကုဒ်ကိုဖမ်းရန်နှင့်မှတ်တမ်းကို log ပြုလုပ်ရန်အောက်ပါအတိုင်း၎င်းကိုသင်ကိုင်တွယ်နိုင်သည် -

 while (true) {
    $clientSocket = @socket_accept($socket);
    if ($clientSocket === false) {
        $errCode = socket_last_error($socket);
        $errMsg = socket_strerror($errCode);
        error_log("socket_accept() failed with error [$errCode]: $errMsg\n", 3, "/var/log/php_socket_error.log");

        // သင်လိုအပ်သလိုကွင်းဆက်ကိုဆက်လုပ်ရန်သို့မဟုတ်ရပ်ဆိုင်းရန်ရွေးချယ်နိုင်သည်
        continue;
    }

    // ဆက်သွယ်မှုကိုလက်ခံရရှိပြီးနောက်ယုတ္တိဗေဒထုတ်ယူခြင်း
    $msg = "Hello from server on http://m66.net\n";
    socket_write($clientSocket, $msg, strlen($msg));
    socket_close($clientSocket);
}

ဒီကုဒ်ထဲမှာ:

  • @ operator သည် socket_accept မှပစ်ချသည့်ပုံသေသတိပေးချက်ကိုဖိနှိပ်ရန်အသုံးပြုသည်။

  • Socket_last_Error () သည် နောက်ဆုံး socket လည်ပတ်မှု၏အမှားကုဒ်ကိုရရှိသည်။

  • Socket_Stror () အမှားကုဒ်ကိုလူတို့၏ဖတ်နိုင်သောကြိုးများအဖြစ်ပြောင်းလဲခြင်း,

  • error_log () သည် /var/log/php_php_socket_error.log file သို့အမှားများကိုရေးသည်။

မှတ်စု: Log file လမ်းကြောင်းသို့စာရေးရန်ခွင့်ပြုချက်ရှိကြောင်းနှင့်မှတ်တမ်းဖိုင်၏မိဘလမ်းညွှန်တည်ရှိကြောင်းသေချာပါစေ။

readability နှင့်ပြုပြင်ထိန်းသိမ်းမှုတိုးတက်စေရန်

Error log ကို function မြှင့်တင်ခြင်းနှင့်ပေါင်းစည်းသည့် format output အတွက် function ကိုဖွင့်နိုင်သည်။

 function log_socket_error($socket, $context = '') {
    $errCode = socket_last_error($socket);
    $errMsg = socket_strerror($errCode);
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$context] Error [$errCode]: $errMsg\n";
    error_log($logEntry, 3, "/var/log/php_socket_error.log");
}

အသုံးပြုနည်းကိုအောက်ပါအတိုင်းဖြစ်သည် -

 $clientSocket = @socket_accept($socket);
if ($clientSocket === false) {
    log_socket_error($socket, 'socket_accept');
    continue;
}

ကောက်ချက်

အထက်ပါနည်းလမ်းအားဖြင့် Socket_Acception အတွက်အခက်အခဲများကိုရှောင်ရှားရန် Socket_Accept () ကိုရှောင်ရှားရန် socket_accept () ကို အသုံးပြုသောအခါအမှားအယွင်းများကိုထိထိရောက်ရောက်ဖမ်းယူနိုင်သည်။ တစ်ချိန်တည်းမှာပင်ဖိုင်များသို့မှတ်တမ်းများသည်နောက်ဆက်တွဲလည်ပတ်မှုနှင့်ပြုပြင်ထိန်းသိမ်းမှုစစ်ဆေးခြင်းနှင့်အလိုအလျောက်စောင့်ကြည့်လေ့လာခြင်းစနစ်များကိုပေါင်းစပ်ခြင်းများလွယ်ကူချောမွေ့စေသည်။ အမှန်တကယ်ထုတ်လုပ်မှုပတ် 0 န်းကျင်များတွင်လည်းအလားတူဆန်းသို့မဟုတ်အခြားဗဟိုပြုစနစ်များကိုထပ်မံဖြည့်ဆည်းနိုင်အောင်ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ရန်လည်းအကြံပြုသည်။