စွမ်းဆောင်ရည်မြင့်မားသော 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);
?>
Socket_set_set_nonBlock () ကို အသုံးပြုခြင်း၏အဓိကအားသာချက်များမှာ -
၎င်းသည်အဓိကချည်မျှင်ကိုမပိတ်ပါ, ဆက်သွယ်မှုမျိုးစုံကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်သည်။
ပိုမိုရှုပ်ထွေးသောအဖြစ်အပျက်ကွင်းများကိုအကောင်အထည်ဖော်ရန် Socket_select () နှင့်ပေါင်းစပ်ထားသောလုပ်ဆောင်ချက်များနှင့်ပေါင်းစပ်ရန်လွယ်ကူသည်။
၎င်းသည် chat rooms များ, လက်ငင်းစာတိုပေးပို့ရေး, websock server များစသည့်အသွင်အပြင်မြင့်မားသောတစ်ပြိုင်နက်တည်းဖြစ်စဉ်ကိုတိုးတက်စေနိုင်သည်။
ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်, အမှားအယွင်းများကိုဖိနှိပ်ခြင်းသို့မဟုတ် judge socket_last_Error () ကိုအကဲဖြတ်ရန် socket_last_Error () ကို အကဲဖြတ် ခြင်းကဲ့သို့သောခြွင်းချက်ကိုင်တွယ်ရန်အာရုံစိုက်ရန်လိုအပ်သည်။
Code Logic တွင်အရင်းအမြစ်ယိုစိမ့်မှုကိုရှောင်ရှားရန်ဆက်သွယ်မှု၏ဘဝသံသရာကိုတက်ကြွစွာစီမံရန်လိုအပ်သည်။
ရှုပ်ထွေးသောတစ်ပြိုင်နက်တည်းထိန်းချုပ်မှုအတွက် ( PCNTL_Fork () ) သို့မဟုတ် coroutine frameworks (ဥပမာ -Southee) ကို အသုံးပြု. လုပ်ငန်းစဉ်များစွာကိုပေါင်းစပ်စဉ်းစားနိုင်သည်။
Socket_set_set_set_nonblock () ကိုပေါင်းစပ်ခြင်းဖြင့်ကျွန်ုပ်တို့သည် PHP ကွန်ယက်အက်ပလီကေးရှင်းများ၏တစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုများနှင့်တုန့်ပြန်မှုမြန်နှုန်းကိုထိရောက်စွာတိုးတက်အောင်ပြုလုပ်နိုင်သည်။ PHP သည် Network Programming တွင်အခြေခံဘာသာစကားအချို့ကဲ့သို့သောအချို့သောအစွမ်းထက်သည်မဟုတ်သော်လည်း၎င်းသည်တည်ငြိမ်။ ယုံကြည်စိတ်ချရသောကွန်ယက်ဝန်ဆောင်မှုစနစ်ကိုကျိုးကြောင်းဆီလျော်သောနည်းလမ်းဖြင့်တည်ဆောက်နေဆဲဖြစ်သည်။ ဤဆောင်းပါးသည်ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်ရေးယန္တရားနှင့်၎င်း၏အလေ့အကျင့်များကိုနားလည်ရန်ကူညီပေးပါကြောင်းမျှော်လင့်ပါသည်။