PHP တွင် Socket_Accept () function သည် socket socket-based ကိုအခြေခံသည့်သော့ချက်လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ၎င်းသည် client connection တောင်းဆိုမှုများကိုလက်ခံရန်အသုံးပြုသည်။ ကွန်ရက် 0 န်ဆောင်မှုများတည်ဆောက်ရာတွင် client connection များကိုကိုင်တွယ်ရာတွင်အဓိကချိတ်ဆက်မှုဖြစ်သည်။ ဤဆောင်းပါးသည်ထိရောက်သောနှင့်တစ်ပြိုင်နက်တည်း client conver client certican cerly connection processing ကိုရရှိရန် Socket_Accept () ကို မည်သို့အသုံးပြုရမည်ကိုအသေးစိတ်ဖော်ပြထားသည်။
Socket_Accept () သည် နားထောင်ထားသော socket မှချိတ်ဆက်ထားသော client socket ကိုထုတ်ယူပြီး client နှင့်ဆက်သွယ်ရန် societ အရင်းအမြစ်အသစ်ကိုပြန်ပို့ပေးလိမ့်မည်။ ဆက်သွယ်မှုမရှိပါကစောင့်ဆိုင်းလိုက်ပါ။ ရိုးရိုးလေးပြောရလျှင်၎င်းသည် client connection များကိုလက်ခံရန်ဆာဗာအတွက် 0 င်ခွင့်ဖြစ်သည်။
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
echo "client connection ကိုလက်ခံခြင်းမအောင်မြင်ပါ: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "client connection ကိုအောင်မြင်စွာလက်ခံပါ\n";
}
PHP သူ့ဟာသူတစ် ဦး တည်း - ချည်ဖြစ်ပါတယ်။ Socket_Accept () ဆက်သွယ်မှုမျိုးစုံကိုတိုက်ရိုက်လုပ်ဆောင်ရန်အတွက်တိုက်ရိုက်လုပ်ဆောင်ရန်အတွက်တိုက်ရိုက်လုပ်ဆောင်ခြင်းသည်မလုပ်ဆောင်ပါကဆာဗာသည် 0 န်ဆောင်မှုခံယူသူတစ် ဦး အားပိတ်ဆို့ခြင်းကိုတစ်ချိန်တည်းတွင်မတုံ့ပြန်နိုင်ပါ။
ဤပြ problem နာကိုဖြေရှင်းရန်အများအားဖြင့်အသုံးပြုသောဖြေရှင်းနည်းများတွင် -
Multi-process / Multi-Threading - client တစ်ခုစီကို PCNTL_Fork () မှတဆင့်ကလေးဖြစ်စဉ်များကိုဖန်တီးပါ။
ပိတ်ဆို့ခြင်းမဟုတ်သော mode and Matchiming - Socket_set_nonBlock () နှင့် Socket_select () နှင့်ပေါင်းစပ်ထားသောချည်တစ်ခုတည်းတွင်ချိတ်ဆက်မှုများစွာကိုစစ်တမ်းကောက်ယူခြင်း () ။
Event-driven မူဘောင် - allynchronous io ကိုအကောင်အထည်ဖော်ရန် RefPPP ကဲ့သို့သောတတိယပါတီစာကြည့်တိုက်များကိုအသုံးပြုပါ။
ဤဆောင်းပါးသည်လုပ်ငန်းစဉ်ဘာသာစကားများကိုအဓိကထားပြီးတစ်ပြိုင်နက်တည်းဖောက်သည်များကိုထိရောက်စွာကိုင်တွယ်ရန် Socket_Accept ကို မည်သို့အသုံးပြုရမည်ကိုပြသခဲ့သည်။
အောက်ပါဥပမာသည်အဓိကဖြစ်စဉ်ကိုနားထောင်ခြင်းနှင့်ဆက်သွယ်မှုကိုလက်ခံခြင်းအတွက်တာဝန်ရှိသည့်ရိုးရှင်းသော Multi-process server တစ်ခုကိုပြသသည်။
<?php
// ဖန်တီး TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
echo "ဆာဗာစတင်ခြင်း,ဆိပ်ကမ်းကိုနားထောင်ပါ 8080...\n";
while (true) {
// client ဆက်သွယ်မှုကိုလက်ခံပါ(ပိတ်ဆို့)
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept အမှား: " . socket_strerror(socket_last_error()) . "\n";
continue;
}
// ဖန်တီးsubprocess processing client ကို
$pid = pcntl_fork();
if ($pid == -1) {
echo "无法ဖန်တီး子进程\n";
socket_close($client);
continue;
} elseif ($pid > 0) {
// မိဘလုပ်ငန်းစဉ်သည် client connection connection ကိုပိတ်သည်,စောင့်ကြည့်လေ့လာပါ
socket_close($client);
// သင်သည်ကလေးဖြစ်စဉ်ကိုစောင့်ဆိုင်းရန်သို့မဟုတ်ပြန်လည်ထူထောင်ရန်အချက်ပြအပြောင်းအလဲကိုသုံးရန်သင်ရွေးချယ်နိုင်သည်
} else {
// subprocess processing client ကို
socket_close($server); // ကလေးဖြစ်စဉ်တွင်နားထောင်ခြင်း socket ကိုပိတ်ပါ
$msg = "အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည် m66.net PHP ဆာဆာ!\n";
socket_write($client, $msg, strlen($msg));
// Client Message ကိုဖတ်ပါ
$input = socket_read($client, 2048);
echo "တစ် ဦး client ကိုမက်ဆေ့ခ်ျကိုလက်ခံရရှိခဲ့သည်: $input\n";
// ရိုးရှင်းသောပဲ့တင်သံ
socket_write($client, "ဆာဆာ已收到: " . $input);
socket_close($client);
exit(0); // subprocess ထွက်ပေါက်
}
}
TCP socket တစ်ခုကိုဖန်တီးရန် Socket_create ကို သုံး. ဆိပ်ကမ်းကိုချည်နှောင်ပြီးနားထောင်ပါ။
client client ကိုစောင့်ဆိုင်းရန် socket_accept ကိုသုံးရန် () ကို သုံးပါ။
ကလေးဖြစ်စဉ်ကိုဖန်တီးရန် PCNTL_Fork () ကို သုံးပါ။ မိဘလုပ်ငန်းစဉ်သည် client socket ကိုပိတ်ပြီးဆက်လက်နားထောင်နေသည်။ 0 န်ဆောင်မှုခံယူသူအချက်အလက်များကိုစာဖတ်ခြင်းနှင့်ရေးသားခြင်းအတွက်ကလေးဖြစ်စဉ်သည်တာဝန်ရှိသည်။
ဖုတ်ကောင်ဖြစ်စဉ်များကိုရှောင်ရှားရန်ကလေးလုပ်ငန်းစဉ်ပြီးဆုံးပြီးနောက်ထွက်ပါ။
ဖုတ်ကောင်ဖြစ်စဉ်များကိုကာကွယ် <br> အဓိကလုပ်ငန်းစဉ်သည် Zombie ဖြစ်စဉ်များကိုစုဆောင်းခြင်းမှကာကွယ်ရန်တားဆီးရန်အချက်ပြ processing သို့မဟုတ် pcntl_waitpid () ကို PCNNTL_WAITPID () ကိုပြန်လည်ခေါ်ဆိုခြင်းသို့မဟုတ် PCNNTL_WAITION ခေါ်ဆိုမှုများမှတဆင့်ပြန်လည်အသုံးပြုရန်လိုအပ်သည်။
ပိတ်ဆို့ခြင်းနှင့်မြှောက်ခြင်းများနှင့်မြှောက်ခြင်းများ <br> <br> <br> Socket_select () ကို သုံးရန် (Multiplect) ကိုအကောင်အထည်ဖော်ရန်အတွက် overhead မှရှောင်ရှားရန်တစ်ချိန်တည်းတွင်လုပ်ငန်းစဉ်တစ်ခုတွင်ဖောက်သည်အမြောက်အများကိုနားထောင်နိုင်သည်။
Connection Pool စီမံခန့်ခွဲမှု <br> ဆက်သွယ်မှုအမြောက်အများအတွက် connection pools နှင့် task raque များကို server တည်ငြိမ်မှုကိုတိုးတက်စေရန်ဒီဇိုင်းပြုလုပ်နိုင်သည်။
ကိုင်တွယ်ခြင်းနှင့် logging ချို့ယွင်းချက် အသေးစိတ်အမှားကိုင်တွယ်ခြင်းနှင့်ထုတ်လုပ်ခြင်းပတ် 0 န်းကျင်တွင်သစ်ထုတ်လုပ်ခြင်းနှင့်သစ်ထုတ်လုပ်ခြင်းကိုထည့်သွင်းခြင်းပြ problems နာများကိုဖြေရှင်းရန်ကူညီနိုင်သည်။
Multi-process method method နှင့်ပေါင်းစပ်ထားသော socket_accept () thenocure ဖြင့်ထိရောက်သော concurrent client conscal client client conver certican certican client connection process ကိုရရှိနိုင်ပါသည်။ PHP ကိုယ်တိုင်က concurrent network programming တွင်မကောင်းသော်လည်း၎င်းသည်ကျိုးကြောင်းဆီလျော်သောဒီဇိုင်းနှင့်စနစ်ခေါ်ဆိုမှုများမှတဆင့်အချိန်မီတုန့်ပြန်သောကွန်ယက် 0 န်ဆောင်မှုများကိုဖန်တီးနိုင်သည်။
Multi-process mode သည်ရိုးရှင်းပြီးထိုးထွင်းသိမြင်မှုရှိသော်လည်း၎င်းတွင်အရင်းအမြစ်များစွာစားသုံးမှု၏အားနည်းချက်လည်းရှိသည်ဟုမှတ်ချက်ပြုသင့်သည်။ ပိတ်ဆို့ခြင်းမရှိသော IO နှင့် Event-Driven မူဘောင်များကိုပေါင်းစပ်ခြင်းသည်ပိုမိုခေတ်မီသောချဉ်းကပ်နည်းဖြစ်သည်။ တစ်ခုခုကိုလမ်း, socket_accept () connection processing အတွက်အခြေခံဖြစ်ပါတယ်။