Socket-based server applications များကို PHP's Socket_acception () function ကိုအသုံးပြုခြင်းသည်ခေါင်းကိုက်ခြင်းများကိုမကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ ၎င်းသည်များသောအားဖြင့်ဆာဗာသည် 0 န်ဆောင်မှုဆိုင်ရာဆက်သွယ်မှုအသစ်များကိုလက်ခံရန်ပျက်ကွက်သည်။ ဤဆောင်းပါးသည်ဤပြ problem နာ၏အကြောင်းရင်းများကိုအသေးစိတ်လေ့လာပြီးပိုမိုတည်ငြိမ်။ ကြံ့ခိုင်သော socket socket socketing ကိုတည်ဆောက်ရန်ကူညီရန်လက်တွေ့ကျသောတုန့်ပြန်မှုမဟာဗျူဟာများကိုဖြည့်ဆည်းပေးလိမ့်မည်။
UNIX ကဲ့သို့သောစနစ်များတွင်လုပ်ငန်းစဉ်တစ်ခုစီတွင်ဖိုင်များ, socket များ, ပိုက်လိုင်းများစသည်တို့စသည့်အရင်းအမြစ်များကိုရည်ညွှန်းသည်။ ဖိုင်ဖော်ပြချက်တစ်ခုသည်ကိန်းဂဏန်းတစ်ခုဖြစ်ပြီးစနစ်သည်ပွင့်လင်းသယံဇာတတစ်ခုစီအတွက်ထူးခြားသော fd တစ်ခုသတ်မှတ်ထားသည်။ ကွန်ယက်ပရိုဂရမ်အတွက် client ကိုဆက်သွယ်သည့်အခါတိုင်း FD အသစ်တစ်ခုကိုဖန်တီးသည်။
ပုံမှန်အားဖြင့်လုပ်ငန်းစဉ်တစ်ခုတည်းအတွက် Linux စနစ်ဖွင့်လှစ်နိုင်သည့် FD အရေအတွက်သည်အကန့်အသတ်ရှိသည် (များသောအားဖြင့် 1024) ။ တစ်ပြိုင်နက်တည်း concurnent socket socket 0 န်ဆောင်မှုကိုသင်လည်ပတ်သောအခါ Connection အရင်းအမြစ်များကိုစနစ်တကျစီမံခြင်းမရှိပါက FD သည်အလွန်လျင်မြန်စွာပင်ပန်းနေလိမ့်မည်။
PHP, Socket_accept () တွင် Socket Programming () တွင် client connection များကိုလက်ခံရန်အသုံးပြုသောသော့ချက်ဖြစ်သည်။ အခြေခံအသုံးပြုမှုမှာအောက်ပါအတိုင်းဖြစ်သည် -
$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);
if ($client) {
// client ဆက်သွယ်မှုကိုကိုင်တွယ်
}
}
အချိန်တိုင်း socket_accept () ကို အောင်မြင်စွာကွပ်မျက်ခံရပြီး client societ society အသစ်တစ်ခုကိုဖန်တီးထားပြီး၎င်းသည် FD ကိုသိမ်းပိုက်လိမ့်မည်။ အကယ်. 0 န်ဆောင်မှု ခံယူ သူအားအချိန်မီမဖွင့်ပါကပုံမှန်မဟုတ်သောအခြေအနေများအောက်တွင်မထုတ်ပြန်ပါက FDS အရေအတွက်သည်ဆက်လက်မြင့်တက်လာလိမ့်မည် ။
စနစ်မှခွင့်ပြုထားသောဖိုင်အရေအတွက်အများဆုံးအရေအတွက်ကိုအတည်ပြုပြီးသင့်လျော်စွာတိုးမြှင့်ပါ။
ulimit -n 65535
/etc/security/limits.ccf ကိုတည်းဖြတ်ခြင်းအားဖြင့်သင် setting ကိုဆက်လက်လုပ်ဆောင်နိုင်သည်။
www-data soft nofile 65535
www-data hard nofile 65535
connection ကိုစောင့်နေစဉ်ပိတ်ဆို့ခြင်း socket_accept_Accept_Accept () ချည်ဆွဲထားလိမ့်မည်။ အကယ်. System FD ကုန်သွားပါက, အစီအစဉ်သည်တင်းကျပ်လိမ့်မည်။ connection အသစ်ကိုလက်မခံနိုင်သည့်တိုင်အစီအစဉ်ကိုဆက်လက်ထိန်းသိမ်းရန် socket_set_set_setock () ကိုသုံးပါ။
socket_set_nonblock($socket);
Delay adlow adlow_Accept () သယံဇာတအတိုင်းမအောင်မြင်ပါ။
$client = @socket_accept($socket);
if ($client === false) {
usleep(100000); // စောင့် 100ms ထပ်ကြိုးစားပါ
continue;
}
client connection သည်အချက်အလက်လွှဲပြောင်းမှုပြီးဆုံးသောအခါဆက်သွယ်မှုကိုရှင်းလင်းစွာပိတ်ထားရမည်။
socket_close($client);
မပိတ်မိပါက FD ကိုတစ်ချိန်လုံးလောင်လိမ့်မည်။ client connections အားလုံးကို array တစ်ခုထဲသို့စီမံခန့်ခွဲရန်အကြံပြုသည်။
ရိုးရိုး ရှင်းရှင်း + Socket_accept နှင့်နှိုင်းယှဉ်ပါက Socket_select () ဖြစ်ရပ်မှန်မောင်းနှင်သည့်မော်ဒယ်လ်ကိုအကောင်အထည်ဖော်ရန်အကြံပြုသည်။ Select () , သင်ဆက်သွယ်မှုမျိုးစုံကိုတစ်ချိန်တည်းတွင်နားထောင်ပြီးဖြစ်ရပ်တစ်ခုဖြစ်သည့်အခါမလိုအပ်သောအရင်းအမြစ်များကိုစွန့်ပစ်ခြင်းကိုရှောင်ရှားသည့်အခါဆက်သွယ်မှုကိုသင်နားထောင်နိုင်သည်။
$read = [$socket];
$write = $except = [];
if (socket_select($read, $write, $except, 0) > 0) {
if (in_array($socket, $read)) {
$client = socket_accept($socket);
if ($client) {
socket_set_nonblock($client);
$clients[] = $client;
}
}
}
တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းဖြစ်ရပ်များတွင် FD ကိုတစ်ပြိုင်နက်တည်းဆက်သွယ်မှုအရေအတွက်ကိုကန့်သတ်ခြင်းဖြင့်တစ်ပြိုင်နက်တည်းဖြည့်စွက်ခြင်းမှကာကွယ်နိုင်သည်။
$maxClients = 1000;
if (count($clients) >= $maxClients) {
socket_close($client); // ဆက်သွယ်မှုအသစ်ကိုငြင်းပယ်ပါ
continue;
}
ဆာဗာဖိအားကိုလျှော့ချရန် Nginx သို့မဟုတ်အလားတူ middleware ကို Nginx သို့မဟုတ်အလားတူအသံပြောင်းခြင်းအရေအတွက်ကိုလည်းသင်ကန့်သတ်နိုင်သည်။ ဥပမာအားဖြင့်:
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 80;
server_name m66.net;
location / {
limit_conn conn_limit_per_ip 20;
proxy_pass http://localhost:8080;
}
}
FD ပင်ပန်းနွမ်းနယ်မှုသည် socket 0 န်ဆောင်မှုများရှိဘုံကျည်ဆံများထဲမှတစ်ခုဖြစ်သည်။ ကြံ့ခိုင်သော socket service တစ်ခုတည်ဆောက်ခြင်းသည် run နိုင်သည့်ကုဒ်ရေးရန်မဟုတ်ပါ, သို့သော်အရေးကြီးသည်မှာစနစ်အရင်းအမြစ်များကိုကျိုးကြောင်းဆီလျော်စွာစီမံခန့်ခွဲရန်နှင့်အလားအလာရှိသောအန္တရာယ်များကိုကာကွယ်ရန်ဖြစ်သည်။
သင်၏ Socket Project တွင်သင် societ_accept အမှားအယွင်း () မှားယွင်းသော သို့မဟုတ် "ဖွင့်ထားသောဖိုင်များ" ကိုပြန်ပို့ပါက,