Socket_set_Lock block mode ကိုပိတ်ထားသည်, IO စစ်ဆင်ရေး ( socket_read_read_read_read_write ) သည် လက်ရှိအခြေအနေကိုဖတ်ပြီးသည်အထိသို့မဟုတ်စာကိုအောင်မြင်သည်အထိလက်ရှိလုပ်ငန်းစဉ်သို့မဟုတ်ချည်ကိုပိတ်ဆို့လိမ့်မည်။ ၎င်းသည်တစ် ဦး တည်းသောချည်နှောင်ခြင်းသို့မဟုတ်အနိမ့်တစ်ပြိုင်နက်တည်းဖြစ်စေ,
ပိတ်ဆို့ခြင်းသည်အရင်းအမြစ်သိမ်းရန် <br> <br> ပိတ်ဆို့ခြင်း mode သည်ပရိုဂရမ်ကိုလက်မခံနိုင်သောတောင်းဆိုမှုကိုလက်ကိုင်လုပ်ရန်မတတ်နိုင်သောတောင်းဆိုမှုကိုပြုလုပ်နိုင်သည်။ အထူးသဖြင့်ကွန်ယက်သည်နှောင့်နှေးနေသည့်အခါ,
လျော့နည်းသွားသောတုံ့ပြန်မှုကိုတိုးမြှင့်ခြင်းက latency <br> ဆက်သွယ်မှုများစွာကိုပိတ်ဆို့ထားသည့်အခါဆာဗာသည်အချိန်မီဆက်သွယ်မှုတောင်းဆိုမှုများအသစ်များကိုအချိန်မီမလုပ်ဆောင်နိုင်ပါ။
Threads / ဖြစ်စဉ်များအရေအတွက်ကန့်သတ်ချက်ရှိသည် ဆာဗာ၏တစ်ပြိုင်နက်တည်းစွမ်းရည်ကိုရရှိနိုင်သည့်ချည်သို့မဟုတ်လုပ်ငန်းစဉ်အရေအတွက်ကိုကန့်သတ်ထားသည်။ စစ်ဆင်ရေးများကိုပိတ်ဆို့ခြင်းသည်ဤချည်များသို့မဟုတ်လုပ်ငန်းစဉ်များကိုစောင့်ဆိုင်းနေသည့်အခြေအနေတွင်ပြုလုပ်သည်။
Deadlock အန္တရာယ် <br> အကယ်. နှစ် ဦး နှစ်ဖက်အပြန်အလှန်သီးသန့်အရင်းအမြစ်များအတွက်ယှဉ်ပြိုင်မှုသည်ပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်းနေစဉ်အတွင်းပါဝင်ပတ်သက်ပါက,
Socket_set_setonBlock ကို ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကို socket သို့ socket သို့ပြောင်းရန် IO စစ်ဆင်ရေးသည်လက်ရှိလုပ်ငန်းစဉ်ကိုပိတ်ဆို့လိမ့်မည်မဟုတ်ပါ, သို့သော်ချက်ချင်းပြန်လာလိမ့်မည်မဟုတ်ပါ။ PHP တိုးချဲ့မှုများ၌ (ထိုကဲ့သို့သော ရွေးချယ်ခြင်း , စစ်တမ်းကောက်ယူခြင်း သို့မဟုတ် လစ်ဘရယ် ) များ (PHP တိုးချဲ့ခြင်းတို့ဖြင့်ရွေးချယ်ခြင်း, စစ်တမ်းကောက်ယူခြင်း,
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
socket_set_nonblock($socket);
while (true) {
$client = @socket_accept($socket);
if ($client === false) {
// ဆက်သွယ်မှုအသစ်မရှိပါ,ကွင်းဆက်ကိုဆက်သွားပါ
usleep(10000); // ချိုးပါ,လေှျာ့ပေါ့CPUနေထိုင်ခြင်း
continue;
}
// client ကိုရန် socket ထို့အပြင် non-blocking ကိုထားကြ၏
socket_set_nonblock($client);
// ဒေတာဖတ်နေသို့မဟုတ်ရေးသားတဲ့အခါ,ပေါင်းစပ်ထားသော socket_select နားထောင်ခြင်းအခြေအနေ
}
?>
Socket_select သည် Socket မျိုးစုံ၏ဖတ်ရန်နှင့်ရေးရန်အဆင့်အတန်းကိုနားထောင်ပြီးရေးရန်အဆင့်အတန်းကိုပိတ်ဆို့ခြင်း, ဆက်သွယ်မှုတစ်ခုတည်းကိုပိတ်ဆို့ခြင်းနှင့်ဆက်သွယ်မှုမျိုးစုံလုပ်ဆောင်ရန်ဆာဗာ၏စွမ်းဆောင်ရည်ကိုတိုးတက်စေနိုင်သည်။
<?php
$read = [$socket];
$write = null;
$except = null;
if (socket_select($read, $write, $except, 0, 200000)) {
foreach ($read as $readSocket) {
if ($readSocket === $socket) {
$client = socket_accept($socket);
socket_set_nonblock($client);
// နားထောင်ရန်
} else {
$data = socket_read($readSocket, 1024);
if ($data === false || $data === '') {
socket_close($readSocket);
// စာရင်းစာရင်းမှဖယ်ရှားပါ
} else {
// အချက်အလက်များကိုထုတ်ယူခြင်း
}
}
}
}
?>
SWOOLE နှင့် Refriphp ကဲ့သို့သောပြတ်တောင်းပြတ်တောင်းမူဘောင်များအကူအညီဖြင့်ပိတ်ဆို့ခြင်းကိုလုံးဝရှောင်ရှားနိုင်ပြီးတစ်ပြိုင်နက်တည်းဆက်သွယ်မှုအမြောက်အများကိုအလျင်အမြန်တိုးတက်လာခြင်း,
<?php
use Swoole\Coroutine\Http\Server;
$server = new Server("0.0.0.0", 9501);
$server->handle('/', function ($request, $response) {
$response->end("Hello, Swoole!");
});
$server->start();
?>
အဓိကချည်နှောင်ခြင်းကိုရှောင်ရှားရန်လွတ်လပ်သောလုပ်သားချည်များသို့မဟုတ်လုပ်ငန်းစဉ်များသို့ 0 င်ရောက်ခြင်းကိုပိတ်ထားရန် Multi-process သို့မဟုတ် Multi-Threading ကိုသင့်တသင့်တော်အောင်လုပ်ပါ။
စွန့်စားမှုအချက်များ | တုံ့ပြန်မှုအစီအမံ |
---|---|
ပိတ်ဆို့ခြင်းသည်လုပ်ငန်းစဉ်ကိုအရင်းအမြစ်အသုံးပြုမှုကိုစောင့်ဆိုင်းရန်ဖြစ်သည် | ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသုံးပါသို့မဟုတ်ဖြစ်ရပ်မောင်းသူကိုသုံးပါ |
တုန့်ပြန်ခုံတန်းရှည်နှင့် throughput drop | ဆက်သွယ်မှုမျိုးစုံကိုနားထောင်ရန် Socket_select ကို သုံးပါ |
Thread Pool မော | စိတ်ဖိစီးမှုကိုဝေမျှရန် Multi-Threaded / Multi-process pools များကိုသုံးပါ |
အကျပ်အတည်းအန္တရာယ် | အပြန်အလှန်သီးသန့်ရှင်းရှင်းလင်းလင်းမရှင်းလင်းစေရန်ကျိုးကြောင်းဆီလျော်သယံဇာတအရင်းအမြစ်လက်လှမ်းမီမှုမဟာဗျူဟာကိုဒီဇိုင်းဆွဲပါ |
မြင့်မားသောတစ်ပြိုင်နက်တည်းပတ်ဝန်းကျင်တွင်ပိတ်ဆို့ခြင်း sockets များကိုပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန်နှင့် PHP အစီအစဉ်များကိုထိရောက်စွာတည်ငြိမ်သောလည်ပတ်မှုကိုသေချာစေရန်ပိတ်ဆို့ခြင်း,