လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP ကွန်ယက်အက်ပလီကေးရှင်းများ၏စွမ်းဆောင်ရည်ကိုတိုးတက်စေရန် Socket_Accept () နှင့် Socket_set_set_set_set_set_set_set_set_set_set_set_set_setblock () ကိုမည်သို့အောင်မြင်အောင်လုပ်ရမည်နည်း။

PHP ကွန်ယက်အက်ပလီကေးရှင်းများ၏စွမ်းဆောင်ရည်ကိုတိုးတက်စေရန် Socket_Accept () နှင့် Socket_set_set_set_set_set_set_set_set_set_set_set_set_setblock () ကိုမည်သို့အောင်မြင်အောင်လုပ်ရမည်နည်း။

M66 2025-06-28

စွမ်းဆောင်ရည်မြင့်မားသော PHP ကွန်ယက် 0 န်ဆောင်မှုများတည်ဆောက်သည့်အခါရိုးရာပိတ်ဆို့ခြင်း socket socket commong commission mode ကိုများသောအားဖြင့်တစ်ပြိုင်နက်တည်းကအကောင်အထည်ဖော်မှုလိုအပ်ချက်များကိုဖြည့်ဆည်းပေးနိုင်သည်။ PHP ကွန်ယက်အက်ပလီကေးရှင်းများရှိတုန့်ပြန်မှုမြန်နှုန်းနှင့် throughput လုပ်ထုံးလုပ်နည်းများကိုပိုမိုကောင်းမွန်စေရန် Socket_eCcept_Accoglock () နှင့်အတူ socket_et_set_nonblock () နှင့်အတူ socket_set_set_nonblock () နှင့်အတူ socket_et_set_nonblock () နှင့်အတူ socket_set_etonblock () နှင့်အတူထိရောက်သောနည်းလမ်းတစ်ခုဖြစ်သည်။ ဤဆောင်းပါးသည်ဤနည်းပညာကိုဤနည်းပညာကိုအကောင်အထည်ဖော်ရန်နှင့်ရည်ညွှန်းရန် runnable code ကိုပေးလိမ့်မည်။

ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်ရေးဆိုသည်မှာအဘယ်နည်း။

ပုံမှန်အားဖြင့် PHP Socket Communk သည် Socket_Acception_READ_READ_READ_READ () စစ်ဆင်ရေးကိုဖွင့်သောအခါ client connection or data များမဖတ်နိုင်ပါကပရိုဂရမ်သည်စောင့်ဆိုင်းလိမ့်မည်။ ဤနည်းလမ်းသည်ရိုးရှင်းသော်လည်းပရိုဂရမ်၏တစ်ပြိုင်နက်တည်းစွမ်းရည်ကိုများစွာကန့်သတ်ထားလိမ့်မည်။

ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်ရေးသည်အမြဲတမ်းအချိန်ကုန်စောင့်ဆိုင်းမည့်အစားပရိုဂရမ်၏အခြားအစိတ်အပိုင်းများကိုဆက်လက်လုပ်ဆောင်ရန်ခွင့်ပြုသည်။ ဤယန္တရားသည်မတူညီသောဆက်သွယ်မှုများသို့မဟုတ် 0 န်ဆောင်မှုခံယူသူတောင်းဆိုမှုများကိုတစ်ပြိုင်နက်တည်းရရှိထားသည့်အခြေအနေများကိုကိုင်တွယ်ရန်အလွန်သင့်လျော်သည်။

အဓိကလုပ်ဆောင်ချက်များကိုနိဒါန်း

  • Socket_Accept () - client connection များကိုလက်ခံရန်အသုံးပြုသည်။ ဆက်သွယ်မှုမရှိပါကဆက်သွယ်မှုတစ်ခုမရောက်မှီတိုင်အောင်ပိတ်ဆို့လိမ့်မည်။

  • Socket_set_nonBlock () - socket_accept () ချိတ်ဆက်မှုမရှိခြင်းကြောင့်အဓိကချည်နှောင်မှု () ကိုပိတ်ထားလိမ့်မည်မဟုတ်ပါ။

အကောင်အထည်ဖော်မှုနိယာမ

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

နမူနာကုဒ်

ပိတ်ဆို့ခြင်း non-blocking socket ကို သုံး. ရိုးရိုး PHP server ၏ဥပမာတစ်ခုမှာ -

 <?php
$host = '0.0.0.0';
$port = 8080;

// ဖန်တီးsocket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()));
}

// တည်ဆောက်သည်socketreusable သည်
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);

// ဆိပ်ကမ်း binding
if (!socket_bind($server, $host, $port)) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($server)));
}

// စောင့်ရေှာက်
if (!socket_listen($server, 5)) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($server)));
}

// တည်ဆောက်သည်为ပိတ်ဆို့ခြင်းမဟုတ်သော
socket_set_nonblock($server);

$clients = [];

echo "ဆာဗာစတင်သည်,စောင့်ရေှာက်端口 $port ...\n";

while (true) {
    // ဆက်သွယ်မှုအသစ်များကိုလက်ခံပါ(ပိတ်ဆို့ခြင်းမဟုတ်သော)
    $client = @socket_accept($server);
    if ($client !== false) {
        socket_set_nonblock($client);
        $clients[] = $client;
        echo "ဖောက်သည်အသစ်: " . count($clients) . " ဆက်သွယ်မှုစုစုပေါင်းအရေအတွက်\n";
    }

    // client data လုပ်ငန်းစဉ်
    foreach ($clients as $key => $client) {
        $data = @socket_read($client, 1024, PHP_NORMAL_READ);
        if ($data === false) {
            continue;
        }
        if ($data === "") {
            // client ကို disconnection
            socket_close($client);
            unset($clients[$key]);
            echo "client ကို disconnection\n";
            continue;
        }

        $data = trim($data);
        if ($data) {
            echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
            $response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from m66.net\r\n";
            socket_write($client, $response);
            socket_close($client);
            unset($clients[$key]);
        }
    }

    // ရေှာင်ရှားCPUနေထိုင်ခြင်း100%
    usleep(100000);
}

socket_close($server);
?>

အားသာချက်များနှင့် application အခြေအနေများ

Socket_set_set_nonBlock () ကို အသုံးပြုခြင်း၏အဓိကအားသာချက်များမှာ -

  • ၎င်းသည်အဓိကချည်မျှင်ကိုမပိတ်ပါ, ဆက်သွယ်မှုမျိုးစုံကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်သည်။

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

  • ၎င်းသည် chat rooms များ, လက်ငင်းစာတိုပေးပို့ရေး, websock server များစသည့်အသွင်အပြင်မြင့်မားသောတစ်ပြိုင်နက်တည်းဖြစ်စဉ်ကိုတိုးတက်စေနိုင်သည်။

မှတ်သားရန်အရာ

  1. ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်, အမှားအယွင်းများကိုဖိနှိပ်ခြင်းသို့မဟုတ် judge socket_last_Error () ကိုအကဲဖြတ်ရန် socket_last_Error () ကို အကဲဖြတ် ခြင်းကဲ့သို့သောခြွင်းချက်ကိုင်တွယ်ရန်အာရုံစိုက်ရန်လိုအပ်သည်။

  2. Code Logic တွင်အရင်းအမြစ်ယိုစိမ့်မှုကိုရှောင်ရှားရန်ဆက်သွယ်မှု၏ဘဝသံသရာကိုတက်ကြွစွာစီမံရန်လိုအပ်သည်။

  3. ရှုပ်ထွေးသောတစ်ပြိုင်နက်တည်းထိန်းချုပ်မှုအတွက် ( PCNTL_Fork () ) သို့မဟုတ် coroutine frameworks (ဥပမာ -Southee) ကို အသုံးပြု. လုပ်ငန်းစဉ်များစွာကိုပေါင်းစပ်စဉ်းစားနိုင်သည်။

ကောက်ချက်

Socket_set_set_set_nonblock () ကိုပေါင်းစပ်ခြင်းဖြင့်ကျွန်ုပ်တို့သည် PHP ကွန်ယက်အက်ပလီကေးရှင်းများ၏တစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုများနှင့်တုန့်ပြန်မှုမြန်နှုန်းကိုထိရောက်စွာတိုးတက်အောင်ပြုလုပ်နိုင်သည်။ PHP သည် Network Programming တွင်အခြေခံဘာသာစကားအချို့ကဲ့သို့သောအချို့သောအစွမ်းထက်သည်မဟုတ်သော်လည်း၎င်းသည်တည်ငြိမ်။ ယုံကြည်စိတ်ချရသောကွန်ယက်ဝန်ဆောင်မှုစနစ်ကိုကျိုးကြောင်းဆီလျော်သောနည်းလမ်းဖြင့်တည်ဆောက်နေဆဲဖြစ်သည်။ ဤဆောင်းပါးသည်ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်ရေးယန္တရားနှင့်၎င်း၏အလေ့အကျင့်များကိုနားလည်ရန်ကူညီပေးပါကြောင်းမျှော်လင့်ပါသည်။