လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ပုံမှန်အားဖြင့် blocking အပြုအမူနှင့် socket_acception ၏ကိုင်တွယ်ဖြေရှင်းခြင်းနည်းလမ်းများ ()

ပုံမှန်အားဖြင့် blocking အပြုအမူနှင့် socket_acception ၏ကိုင်တွယ်ဖြေရှင်းခြင်းနည်းလမ်းများ ()

M66 2025-05-18
<?php

// ဤဆောင်းပါးသည်နက်ရှိုင်းစွာဆွေးနွေးပါမည် PHP မကြာခဏကွန်ယက်ပရိုဂရမ်တွင်မကြာခဏကြုံတွေ့သောပုံမှန်ပြ problem နာ:socket_accept() function ကိုပိတ်ဆို့ခြင်း。ကျနော်တို့အကြောင်းတရားများခွဲခြမ်းစိတ်ဖြာပါလိမ့်မယ်,၎င်းသည်ကိုင်တွယ်ဖြေရှင်းနည်းများနှင့်ပိုမိုကောင်းမွန်သောနည်းစနစ်များကိုကိုင်တွယ်ဖြေရှင်းနည်းများကိုလည်းထောက်ပံ့ပေးသည်,developer များပိုမိုထိရောက်စွာရရှိနိုင်သည့်ကွန်ရက် 0 န်ဆောင်မှုများကိုပိုမိုထိရောက်စွာတည်ဆောက်ရန်ကူညီပါ。

// ----------------------------------------------

/**
 * ဘယ်လိုဖြေရှင်းနည်း socket_accept() လုပ်ဆောင်ချက်များကိုအတွက်ပုံမှန်ပိတ်ဆို့ခြင်းပြ problems နာများ?ဖြေရှင်းနည်းများနှင့် optimization နည်းစနစ်များရင်ဆိုင်ဖြေရှင်းခြင်း
 *
 * အသုံးပြုမှုအတွက် PHP ကွန်ယက်ဆာဗာကိုတီထွင်သောအခါ,socket အလွန်အရေးကြီးသောအခန်းကဏ် plays ကစား。
 * အထူးသဖြင့် socket_accept() လုပ်ဆောင်ချက်,နားထောင်နေတယ် socket ဆက်သွယ်မှုကိုစောင့်ဆိုင်း,ပိတ်ဆို့ခြင်းရှိလိမ့်မည်,
 * အစီအစဉ်ကိုအခြားအလုပ်များကိုဆက်လက်လုပ်ဆောင်ရန်ဆက်လက်ဖြစ်ပေါ်စေသည်,၎င်းသည်စနစ်တုံ့ပြန်မှုနှင့်တစ်ပြိုင်နက်တည်းစွမ်းဆောင်ရည်ကိုလျော့နည်းစေသည်。
 * ဤဆောင်းပါးသည်နက်ရှိုင်းစွာဆွေးနွေးပါမည်该问题၏原因,并提供几种常见၏ဖြေရှင်းနည်းများနှင့် optimization နည်းစနစ်များရင်ဆိုင်ဖြေရှင်းခြင်း。
 */

// တစ်、ပြနာခွဲခြမ်းစိတ်ဖြာခြင်း:ဘာကေြာင့် socket_accept() ပိတ်ဆို့ပါလိမ့်မယ်?

/*
socket_accept() ဟုတ်ကဲ့ PHP ၏ Socket တိုးချဲ့中၏တစ်个လုပ်ဆောင်ချက်,用于接受တစ်个来自客户端၏连接请求。
其工作机制ဟုတ်ကဲ့在တစ်个监听中၏ socket ဆက်သွယ်မှုကိုစောင့်ဆိုင်း,တစ် ဦး client ကိုတောင်းဆိုမှုရှိသည့်အခါ,它才会返回တစ်个新၏ socket ပစ္စည်းအင်းအား。

မည်မှျပင်,ခေါ်ဆိုမှုလျှင် socket_accept() နာရီ,没有新၏连接到来,လုပ်ဆောင်ချက်将会တစ်直阻塞在那里,တစ် ဦး connection ကိုဖြစ်ပေါ်သည်အထိ。
ဤသည်အစီအစဉ်ကိုအောက်ဖက်ကွပ်မျက်ခံရနိုင်ရန်မဖြစ်နိုင်ပါ,၎င်းသည်ခြုံငုံလုပ်ငန်းစဉ်အပေါ်သက်ရောက်မှုရှိသည်。
*/

// နှစ်、解决方法တစ်:Non-blocking mode ကိုသတ်မှတ်ပါ

/*
最直接၏方式ဟုတ်ကဲ့将 socket Non-blocking mode ကိုသတ်မှတ်ပါ。
ဒီ mode မှာ,socket_accept() 不会တစ်直等待连接,ဆက်သွယ်မှုမရှိပါက,ဒါကြောင့်ချက်ချင်းပြန်လာပါလိမ့်မယ် false。
*/

$address = '0.0.0.0';
$port = 9000;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $address, $port);
socket_listen($server);

// Non-blocking mode ကိုသတ်မှတ်ပါ
socket_set_nonblock($server);

echo "Server listening on {$address}:{$port}\n";

while (true) {
    $client = @socket_accept($server);
    if ($client === false) {
        // ဆက်သွယ်မှုမရှိပါ,အခြားယုတ္တိဗေဒ Execute
        echo "ဆက်သွယ်မှုကိုစောင့်ဆိုင်း...\n";
        usleep(500000); // အိပ်နေခြင်း 0.5 စက်ဏန့်
        continue;
    }

    // ဆက်သွယ်မှုများပြုပြင်ခြင်း
    socket_write($client, "ဆက်သွယ်မှုမှကြိုဆိုပါသည် m66.net အစေခံ!\n");
    socket_close($client);
}

// သုံး、解决方法နှစ်:အသုံးပြု socket_select() Multiplexing ကိုအကောင်အထည်ဖော်

/*
socket_select() ဟုတ်ကဲ့တစ်种မြှောက်ခဲှမမှု机制,允许我们同နာရီ监听多个 socket,တစ် ဦး တည်းသာတ ဦး တည်း socket 准备好接收连接နာရီ,ငါတို့ခေါ်နေပါတယ် socket_accept()。
这ဟုတ်ကဲ့တစ်种更灵活和性能更优၏方式。
*/

$readSockets = [$server];
$write = null;
$except = null;

while (true) {
    $read = $readSockets;

    if (socket_select($read, $write, $except, 1) > 0) {
        foreach ($read as $sock) {
            if ($sock === $server) {
                $client = socket_accept($server);
                if ($client) {
                    socket_write($client, "သင်အောင်မြင်စွာချိတ်ဆက်ထားပြီ m66.net!\n");
                    socket_close($client);
                }
            }
        }
    } else {
        echo "ဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါ,အခြားအလုပ်များကိုဆက်လက်。\n";
    }
}

// လေး、解决方法သုံး:အသုံးပြု多进程သို့မဟုတ်多线程机制

/*
ပေမဲ့ PHP 并不ဟုတ်ကဲ့တစ်个天然支持多线程၏语言,ဒါပေမယ့်ငါတို့သုံးနိုင်တယ် pcntl_fork() 实现多进程来并发ဆက်သွယ်မှုများပြုပြင်ခြင်း。
ထိုမှျ,အဓိကဖြစ်စဉ်သည်ဆက်လက်နားထောင်နေသည်,client တောင်းဆိုမှုများကိုကိုင်တွယ်ရန်ကလေးလုပ်ငန်းစဉ်သည်တာဝန်ရှိသည်,ပြ problems နာများကိုပိတ်ဆို့ခြင်းမှရှောင်ရှားရန်。
*/

// ဒီနည်းလမ်းအတွက်သင့်လျော်သည် CLI 模式၏ PHP,具体实现需注意子进程ပစ္စည်းအင်းအား回收和并发限制等问题。

// ငါး、အပိုဆောင်း optimization အကြံပြုချက်များ

/*
1. 设置合理၏ socket 超နာရီနာရီ间,ရေှာင်ရှား socket စစ်ဆင်ရေးအသတ်မရှိချိတ်ဆွဲ。
2. အသုံးပြု event တိုးချဲ့(ကဲ့သို့ libevent)ဖြစ်ရပ် - မောင်းနှင်ဖွံ့ဖြိုးတိုးတက်မှုထွက်သယ်ဆောင်,တစ်ပြိုင်နက်တည်းစွမ်းရည်တိုးတက်စေရန်。
3. ထုတ်လုပ်မှုပတ်ဝန်းကျင်အတွက်ပေါင်းစပ် Nginx သို့မဟုတ် Swoole 提供异步高性能网络အစေခံ。
*/

// ခေြာက်、အကျဉ်းချုပ်

/*
socket_accept() 阻塞问题ပေမဲ့常见,ဒါပေမယ့် Non-blocking mode မှတဆင့်、socket_select() မြှောက်ခဲှမမှု、甚至အသုံးပြု多进程等方式,ထိရောက်စွာနှင့်အတူကိုင်တွယ်နိုင်ပါသည်。
သော့ချက်သည်စီမံကိန်းလိုအပ်ချက်များအပေါ် အခြေခံ. ရှုပ်ထွေးမှုနှင့်စွမ်းဆောင်ရည်ကိုချိန်ညှိရန်ဖြစ်သည်,选择最合适၏方案。
မြင့်မားသောရရှိမှုကိုတည်ဆောက်ရန်မျှော်လင့်ချက်သည်、低延迟网络အစေခံ၏ PHP developer များအတွက်,理解并掌握这些技巧ဟုတ်ကဲ့非常必要၏。
*/

?>