<?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 များအတွက်,理解并掌握这些技巧ဟုတ်ကဲ့非常必要၏。
*/
?>