PHP, Socket_Accept ကို အသုံးပြု. Socket-based server application တစ်ခုတည်ဆောက်သည့်အခါ client မှ connection တောင်းဆိုမှုများကိုလက်ခံသည့် conse connection များကိုလက်ခံသည့်အလွန်အဓိကလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ သို့သော်ဆက်နွယ်မှုစီမံခန့်ခွဲမှုစနစ်တကျမကိုင်တွယ်နိုင်ပါကသယံဇာတယိုစိမ့်မှုနှင့်ပုံမှန်မဟုတ်သော 0 န်ဆောင်မှုရပ်စဲခြင်းပင်ဖြစ်ရန်လွယ်ကူသည်။ ဤဆောင်းပါးသည်အရင်းအမြစ်များကိုအချိန်တိုအတွင်းဖြန့်ချိခြင်းနှင့် 0 န်ဆောင်မှုများ၏တည်ငြိမ်မှုနှင့်ယုံကြည်စိတ်ချရမှုကိုထိန်းသိမ်းရန်သေချာစေရန်ဤဆက်သွယ်မှုများကိုမည်သို့ပြုလုပ်နိုင်သည်ကိုလေ့လာလိမ့်မည်။
Elegant Shutdown ကိုနားမလည်မီအခြေခံ Socket Server ၏ပုံသက်သေကိုကြည့်ပါ။
$address = '0.0.0.0';
$port = 12345;
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, $address, $port);
socket_listen($serverSocket);
while (true) {
$clientSocket = socket_accept($serverSocket);
// ရိုးရှင်းသောတုံ့ပြန်မှု
socket_write($clientSocket, "Hello client!\n");
socket_close($clientSocket);
}
ဤဥပမာတွင်ဆာဗာသည်ဆက်လက်လည်ပတ်နေပြီးဆက်သွယ်မှုကိုလက်ခံရရှိသည်။ Code ကို run နိုင်သော်လည်းဆက်သွယ်မှုကိုပိတ်ထားပါကတစ်ပြိုင်နက်တည်းသို့မဟုတ်ရေရှည်လည်ပတ်နေစဉ်အတွင်းခြွင်းချက်များမပါ 0 င်ပါကအောက်ပါပြ problems နာများပေါ်ပေါက်လာနိုင်သည်။
Descriptor ယိုစိမ့်မှု (System Resource Limits)
ဆက်သွယ်မှုကိုမပိတ်ပါ, အချိန်ကိုစုဆောင်းခြင်းကိုဖြစ်ပေါ်စေသည်
အဆိုပါဖြစ်စဉ်ကိုရပ်စဲရန်အတင်းအကျပ်ခိုင်းစေခြင်းငှါ (Sigint)
PHP's Socket_Accept_Accept () သည် ပိတ်ဆို့ခြင်း function တစ်ခုဖြစ်သည်။ ဤအပြုအမူသည် 0 န်ဆောင်မှုကိုထွက်ပြေးခြင်း, အကယ်. အရင်းအမြစ်ကိုမှန်ကန်စွာထုတ်ပြန်ခြင်းမရှိပါက၎င်းကိုဖြစ်ပေါ်နိုင်သည်။
Socket_Close () ကွပ်မျက်ခံရခြင်းမရှိပါ ။ connection ကိုမပိတ်နိုင်ပါ။ စနစ်အရင်းအမြစ်များကိုထုတ်ပြန်ခြင်းမရှိပါ။
ဇာတ်ညွှန်းသည်ပုံမှန်မဟုတ်သောအရာများဖြစ်ပေါ်လာသည် - ဖန်တီးထားသောဆက်သွယ်မှုကိုမသန့်ရှင်းစေပါ။ ဖုတ်ကောင် Socket နောက်သို့ထားခဲ့သည်။
Signal Interupte (ဥပမာ Ctrl + C အဖြစ်) - အဘယ်သူမျှမနောက်ဆက်တွဲအဘယ်သူမျှမ။
Socket_ * စီးရီးများသည်အဆင့်နိမ့်ထိန်းချုပ်မှုကိုပေးသော်လည်း PHP ၏ stream_socket_server () သည် အချိန်ကုန်ထိန်းချုပ်မှုနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သောအပြုအမူများကိုအကောင်အထည်ဖော်ရန်ပိုမိုလွယ်ကူသည်။
သို့သော် Socket_ * * * * * * * ကိုအပြင်းအထန်တောင်းဆိုပါကအောက်ပါနည်းလမ်းများသည်ကြော့ရှင်းသောပိတ်သိမ်းခြင်းကိုရရှိနိုင်ပါသည်။
Socket_set_nonBlock () ကို socket_accept ကို ပိတ်ဆို့ခြင်းမှရှောင်ရှားနိုင်သည်။
socket_set_nonblock($serverSocket);
ဤနည်းအားဖြင့်ကျွန်ုပ်တို့သည်ဆက်သွယ်မှုတစ်ခုရှိ, မရှိကြောင်းစစ်ဆေးရန်ကွင်းဆက်တစ်ခုကိုသုံးနိုင်သည်။
declare(ticks = 1);
$running = true;
pcntl_signal(SIGINT, function() use (&$running) {
echo "ဖမ်းဆီး SIGINT,ထွက်ရန်ပြင်ဆင်ပါ...\n";
$running = false;
});
while ($running) {
$clientSocket = @socket_accept($serverSocket);
if ($clientSocket !== false) {
socket_write($clientSocket, "Hello client!\n");
socket_close($clientSocket);
} else {
usleep(100000); // ရေှာင်ရှား CPU အလွန်မြင့်မားသောထေို
}
}
socket_close($serverSocket);
Socket မျိုးစုံဖြင့်သင်နားထောင်ရန်လိုအပ်ပါက socket_select () ဖြစ်ရပ်မှန်မောင်းနှင်မှုပုံစံကိုအကောင်အထည်ဖော်ရန် () ကိုပေါင်းစပ်နိုင်သည်။
$readSockets = [$serverSocket];
$write = $except = null;
if (socket_select($readSockets, $write, $except, 1) > 0) {
foreach ($readSockets as $sock) {
if ($sock === $serverSocket) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket !== false) {
socket_write($clientSocket, "Hi\n");
socket_close($clientSocket);
}
}
}
}
Socket_select () သည် အချိန်မီ server programs များအကောင်အထည်ဖော်ရန်အတွက်အချိန်မီအကြားရှိအချက်ပြချက်များကိုအနှောင့်အယှက်ပေးနိုင်သည်။
Socket_create () နှင့် Socket_accept မှရရှိသောအရင်းအမြစ်တစ်ခုစီသည် တွဲဖက် . () တွဲဖက်ခြင်းနှင့်ကွပ်မျက်ခံရသည်။ ကောင်းမွန်စွာဖွဲ့စည်းထားသော Socket Service Life Cyle သည်အောက်ပါအတိုင်းဖြစ်သည် -
Socket ကိုအစပြုပါ
Non-blocking / select ကို set
အဓိကကွင်းဆက်နှင့်လုပ်ငန်းစဉ်တောင်းဆိုမှုများတွင်ဆက်သွယ်မှုကိုရယူပါ
အဆိုပါရပ်စဲ signal ကိုဖမ်းယူနှင့်ကွင်းဆက်ထွက်ပါ
ပွင့်လင်းသောဆက်သွယ်မှုအားလုံးကိုရှင်းလင်းပါ
နောက်ဆုံးတော့နားထောင်ခြင်း socket ကိုပိတ်ပါ
ဤတွင် signal capture, non-blocking mode နှင့်သယံဇာတသန့်ရှင်းရေးကိုအကောင်အထည်ဖော်ပြုသောအပြည့်အဝဥပမာတစ်ခုရှိသည်။
declare(ticks = 1);
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 8000);
socket_listen($serverSocket);
socket_set_nonblock($serverSocket);
$running = true;
pcntl_signal(SIGINT, function() use (&$running) {
echo "ရပ်စဲ signal ကိုလက်ခံရရှိခဲ့သည်,ဝန်ဆောင်မှုကိုပိတ်ရန်ပြင်ဆင်ပါ...\n";
$running = false;
});
while ($running) {
$clientSocket = @socket_accept($serverSocket);
if ($clientSocket) {
socket_write($clientSocket, "အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည် m66.net!\n");
socket_close($clientSocket);
} else {
usleep(100000);
}
}
socket_close($serverSocket);
echo "0 န်ဆောင်မှုကို Elective ကိုပိတ်ထားသည်。\n";
PHP မှပေးသော Socket Programming interface သည်အင်အားကြီးမားသော်လည်းအရင်းအမြစ်စီမံခန့်ခွဲမှု၏ရှုပ်ထွေးမှုကိုဖြစ်ပေါ်စေသည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ခြင်းဖြင့်ရပ်စဲခြင်းအချက်ပြချက်များကိုနားထောင်ခြင်းဖြင့် Socket_select () နှင့်အခြားနည်းလမ်းများဖြင့်နားထောင်ခြင်းကိုနားထောင်ခြင်းဖြင့် "လှပသော shutdown" ကို အသုံးပြု. PHP တွင်ရရှိနိုင်ပါသည်။ PHP တွင်ရရှိမည်ဖြစ်သည်။ ရှည်လျားသော 0 န်ဆောင်မှုများကိုတည်ဆောက်ရာတွင်ဤနည်းလမ်းများသည်အထူးအရေးကြီးသည်။
အောက်ဖော်ပြပါအချက်များအပါအဝင်သင်ဖွင့်ထားသည့်အရင်းအမြစ်တိုင်းကိုအမြဲတမ်းထုတ်ပေးပါ။