Socket-based server application ကို PHP, Socket_Accept () ကို အသုံးပြု. () ကို အသုံးပြု. () သည်နားထောင်ခြင်း socket မှဆက်သွယ်မှုကိုလက်ခံသည့်အလွန်အဓိကလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ သို့သော်မြင့်မားသောတစ်ပြိုင်နက်တည်းပတ်ဝန်းကျင်တွင် developmers များသည် socket_acception () ပိတ်ဆို့ခြင်း, တုံ့ပြန်မှုနှောင့်နှေးမှုများနှင့်ဆာဗာပျက်ခြင်းနှင့်ဆာဗာပျက်ခြင်းများပင်တွေ့ရသည်။ ဤဆောင်းပါးသည်နောက်ခံယန္တရားမှစတင်မည်ဖြစ်ပြီးအဘယ်ကြောင့် socket_accept () အဘယ်ကြောင့် socket_accept () အဘယ်ကြောင့်အဘယ်ကြောင့်အသေးစိတ်လေ့လာသုံးသပ်ခြင်းနှင့် PHP ၏အကောင်အထည်ဖော်မှုအပေါ်အခြေခံပြီး optimization အကြံပြုချက်များကိုပိုမိုကောင်းမွန်သောအကြံပြုချက်များကိုဖြည့်ဆည်းပေးသည်။
PHP မှ TCP server တစ်ခုကိုဖန်တီးခြင်းအတွက်အထွေထွေဖြစ်စဉ်သည်အောက်ပါအတိုင်းဖြစ်သည် -
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
// နောက်ဆက်တွဲ $client ဖတ်ပါနှင့်ရေးပါ
}
Socket_Accept ၏ရည်ရွယ်ချက် () ၏ရည်ရွယ်ချက်မှာနားထောင်ခြင်း socket မှလက်ဆွဲနှုတ်ဆက်ခြင်းမှလက်ဆွဲနှုတ်ဆက်ခြင်းကိုဖြည့်ဆည်းပေးပြီးဒေတာဆက်သွယ်ရေးအတွက် society အသစ်တစ်ခုကိုပြန်ပို့ပါ။
ပုံမှန်အားဖြင့် socket_accept () ပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းဖြစ်သည်။ client connection မရှိပါကဆက်သွယ်မှုတစ်ခုမရောက်မချင်းစောင့်ဆိုင်းလိမ့်မည်။ ဤနည်းလမ်းသည်အနိမ့်တစ်ပြိုင်နက်တည်းကအခြေအနေများတွင်ကောင်းစွာလည်ပတ်နိုင်သော်လည်းအောက်ပါပြ problems နာများကိုမြင့်မားသောတစ်ပြိုင်နက်တည်း -
Socket_Accept () ပိတ်ဆို့ခြင်းကတည်းကဆက်သွယ်မှုကိုစောင့်နေစဉ်အခြားယုတ္တိဗေဒကိုမလုပ်ဆောင်နိုင်ပါ။ တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်ဆက်သွယ်မှုတောင်းဆိုမှုများတွင်ထောင်နှင့်ချီသောဆက်သွယ်မှုတောင်းဆိုမှုများသည်တစ်ချိန်တည်းရောက်ရှိရန်နှင့်ဆက်သွယ်မှုတစ်ခုတည်းကိုသာအဓိကကွင်းဆက်တွင်အချိန်မရွေးလုပ်ဆောင်နိုင်သည်။ ဤ "တစ်ကိုယ်ရေချည်နှောင်ခြင်း" ကုသမှုနည်းလမ်းသည်မြင့်မားသောတစ်ပြိုင်နက်တည်းကအရပိတ်ဆို့မှုနည်းပါးဖွယ်ရှိသည်။
TCP protocol သည် handshipakes သုံးခုပြီးစီးခဲ့သော်လည်း application layer မှလက်ခံခြင်းမရှိသေးသောဆက်သွယ်မှုများကိုသိမ်းဆည်းရန် TCP protocol ကိုဆာဗာဘေးထွက်ရှိ Backlog ကိုထိန်းသိမ်းထားသည်။ အကယ်. တန်းစီသည်အပြည့်အဝရှိပါကဆက်သွယ်မှုအသစ်ကို operating system မှတိုက်ရိုက်ပယ်ချလိမ့်မည်။ PHP Socket_listen () ၏တတိယမြောက် pareter သည် default before 128 သာဖြစ်နိုင်သည်။
socket_listen($socket, 1024); // တိုးမြှင့်လာသည် backlog အရွယ်
Backlog သည်ကြီးမားလွန်းလျှင်ပင် socket_accept () ဆက်သွယ်မှုကိုအချိန်မီမကိုင်တွယ်နိုင်ပါကတန်းစီသည်လျင်မြန်စွာပြည့်နှက်လိမ့်မည်။
PHP ၏ CLI Mode သည်မရှိမဖြစ်လိုအပ်သော, ပိတ်ဆို့ခြင်း, တစ်ခုတည်းသောချည်မျှင်များနှင့်ပြတ်တောင်းပြတ်တောင်းသော I / O နှင့် Concurrency စွမ်းရည်ကင်းမဲ့နေသည်။ ဆိုလိုသည်မှာကျွန်ုပ်တို့သည် Nginx (သို့) node.js.js. တစ်ခုကဲ့သို့ဖြစ်ရပ်မှန်မောင်းနှင်သည့်မော်ဒယ်တစ်ခုမှတစ်ပြိုင်တည်းဆက်သွယ်မှုမျိုးစုံကိုတစ်ပြိုင်တည်းမကိုင်တွယ်နိုင်ခြင်းဖြစ်သည်။ PCNTL_Fork () ကို ကလေးဖြစ်စဉ်များကိုဖန်တီးရန်အသုံးပြုနိုင်သော်လည်း၎င်းသည်အရင်းအမြစ်များစွာစားသုံးပြီးစီမံခန့်ခွဲမှုတွင်ရှုပ်ထွေးသည်။
ထို့အပြင် PHP တွင်ပါ 0 င်သောစွမ်းဆောင်ရည်မြင့်မားသောဖြစ်ရပ် Loop Mineism (EPOLL, Kqqqueue) တွင်ပါ 0 င်သောစွမ်းဆောင်ရည်မြင့်မားသောလုပ်ထုံးလုပ်နည်းဆိုင်ရာယန္တရားမရှိပါ။
တိုးတက်မှုနည်းလမ်းတစ်ခုမှာပိတ်ဆို့ခြင်းမဟုတ်သော I / O Socket_select () နှင့်ပေါင်းစပ်ခြင်းမပြုပါ။
$clients = [];
while (true) {
$read = array_merge([$socket], $clients);
$write = $except = null;
if (socket_select($read, $write, $except, null) > 0) {
if (in_array($socket, $read)) {
$newClient = socket_accept($socket);
if ($newClient) {
$clients[] = $newClient;
socket_getpeername($newClient, $ip, $port);
echo "ဆက်သွယ်မှုအသစ် $ip:$port\n";
}
}
foreach ($clients as $key => $client) {
$data = socket_read($client, 1024, PHP_NORMAL_READ);
if ($data === false || trim($data) == '') {
unset($clients[$key]);
socket_close($client);
continue;
}
socket_write($client, "You said: $data");
}
}
}
ဤနည်းလမ်းသည် societ_acception_Acception ၏စွမ်းဆောင်ရည်မြှင့်တင်ခြင်း () ၏စွမ်းဆောင်ရည်မြှင့် တင်ခြင်း () ကို အတိုင်းအတာတစ်ခုအထိလျော့နည်းစေနိုင်သည်။ ဆက်သွယ်မှုများစွာရှိသည့်အခါ () သူ့ဟာသူသည်မတတ်နိုင်ပါလိမ့်မည်။ EPOLL ကဲ့သို့သော EPPL ကဲ့သို့သောပိုမိုထိရောက်သောမော်ဒယ်များကို PHP မှမထောက်ပံ့ပါ။
Code-level optimization အပြင်အချို့သောတိုးတက်မှုများကိုဖြန့်ကျက်မည့်အလွှာတွင်ပြုလုပ်နိုင်သည်။
Reverse Proxy ကို အသုံးပြု . Chright Processings ကိုဖြန့်ဝေရန်ပြောင်းပြန် proxy server ကိုအသုံးပြုပါ။
PHP extension သို့မဟုတ် swoole ကိုသုံးပါ ။ အကယ်. စီးပွားရေးသည်မြင့်မားသောတစ်ပြိုင်နက်တည်းလိုအပ်ချက်များကိုအသုံးပြုပါက Coroutine အခြေပြု Uslophrice 0 န ်ဆောင်မှုပုံစံကိုအကောင်အထည်ဖော်သည့် SWOOLE ကဲ့သို့ PHP extension များကိုအသုံးပြုခြင်းကိုသင်စဉ်းစားနိုင်သည်။
Multi-process (သို့ ) Daemon Model - PCNEML_Fork ( ) ကိုသုံးပါ။
Socket_Accept () အဘယ်ကြောင့် socket_accept () အရအဘယ်ကြောင့်ဆိုသလိုအသည်းအသန်အနေဖြင့်ပိတ်ဆို့ခြင်းသည်၎င်း၏ပိတ်ဆို့ခြင်းယန္တရားနှင့် PHP Single-Threaded Model ၏ကန့်သတ်ချက်ဖြစ်သည်။ တစ်ပြိုင်နက်တည်းတွင်အချို့သောအတိုင်းအတာကို Socket_select ( SWOOLE ကဲ့သို့) ကိုထောက်ပံ့သော extension များကိုအသုံးပြုခြင်း,
မြင့်မားသောတစ်ပြိုင်နက်တည်းဖြစ်ရပ်များတွင် socket ကိုအသုံးပြုခြင်းသည် code optimization ၏ပြ problem နာတစ်ခုသာမကဗိသုကာဒီဇိုင်းနှင့်မော်ဒယ်များတွင်ပြည့်စုံသောစိန်ခေါ်မှုတစ်ခုသာဖြစ်သည်။ မြင့်မားသောတစ်ပြိုင်နက်တည်းကရှည်လျားသောဆက်သွယ်မှု 0 န်ဆောင်မှုများကိုတည်ဆောက်ရန် PHP ကိုရွေးချယ်ရာတွင်၎င်းသည်၎င်း၏သဘာဝကန့်သတ်ချက်များနှင့်ပမာဏကိုချိန်ညှိရန်အရေးကြီးသည်။