လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_Accept ကိုအသုံးပြုသောအခါ FD (File Descriptor) ကိုမည်သို့ရှောင်ရှားရမည်နည်း

Socket_Accept ကိုအသုံးပြုသောအခါ FD (File Descriptor) ကိုမည်သို့ရှောင်ရှားရမည်နည်း

M66 2025-06-04

Socket-based server applications များကို PHP's Socket_acception () function ကိုအသုံးပြုခြင်းသည်ခေါင်းကိုက်ခြင်းများကိုမကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ ၎င်းသည်များသောအားဖြင့်ဆာဗာသည် 0 န်ဆောင်မှုဆိုင်ရာဆက်သွယ်မှုအသစ်များကိုလက်ခံရန်ပျက်ကွက်သည်။ ဤဆောင်းပါးသည်ဤပြ problem နာ၏အကြောင်းရင်းများကိုအသေးစိတ်လေ့လာပြီးပိုမိုတည်ငြိမ်။ ကြံ့ခိုင်သော socket socket socketing ကိုတည်ဆောက်ရန်ကူညီရန်လက်တွေ့ကျသောတုန့်ပြန်မှုမဟာဗျူဟာများကိုဖြည့်ဆည်းပေးလိမ့်မည်။

1 ။ ဖိုင်ဖော်ပြချက် (FD) ဆိုတာဘာလဲ။

UNIX ကဲ့သို့သောစနစ်များတွင်လုပ်ငန်းစဉ်တစ်ခုစီတွင်ဖိုင်များ, socket များ, ပိုက်လိုင်းများစသည်တို့စသည့်အရင်းအမြစ်များကိုရည်ညွှန်းသည်။ ဖိုင်ဖော်ပြချက်တစ်ခုသည်ကိန်းဂဏန်းတစ်ခုဖြစ်ပြီးစနစ်သည်ပွင့်လင်းသယံဇာတတစ်ခုစီအတွက်ထူးခြားသော fd တစ်ခုသတ်မှတ်ထားသည်။ ကွန်ယက်ပရိုဂရမ်အတွက် client ကိုဆက်သွယ်သည့်အခါတိုင်း FD အသစ်တစ်ခုကိုဖန်တီးသည်။

ပုံမှန်အားဖြင့်လုပ်ငန်းစဉ်တစ်ခုတည်းအတွက် Linux စနစ်ဖွင့်လှစ်နိုင်သည့် FD အရေအတွက်သည်အကန့်အသတ်ရှိသည် (များသောအားဖြင့် 1024) ။ တစ်ပြိုင်နက်တည်း concurnent socket socket 0 န်ဆောင်မှုကိုသင်လည်ပတ်သောအခါ Connection အရင်းအမြစ်များကိုစနစ်တကျစီမံခြင်းမရှိပါက FD သည်အလွန်လျင်မြန်စွာပင်ပန်းနေလိမ့်မည်။

2 ။ Socket_Accept ၏လုပ်ငန်းယန္တရား ()

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 အရေအတွက်သည်ဆက်လက်မြင့်တက်လာလိမ့်မည်

3 ။ FD ပင်ပန်းနွမ်းနယ်မှုကိုမည်သို့ရှောင်ရှားနိုင်သနည်း။

1 ။ FD အထက်ကန့်သတ်ချက်ကိုသတ်မှတ်ပါ

စနစ်မှခွင့်ပြုထားသောဖိုင်အရေအတွက်အများဆုံးအရေအတွက်ကိုအတည်ပြုပြီးသင့်လျော်စွာတိုးမြှင့်ပါ။

 ulimit -n 65535

/etc/security/limits.ccf ကိုတည်းဖြတ်ခြင်းအားဖြင့်သင် setting ကိုဆက်လက်လုပ်ဆောင်နိုင်သည်။

 www-data soft nofile 65535
www-data hard nofile 65535

2 ။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုမှ socket ထားပါ

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;
}

3 ။ တက်ကြွစွာမမှန်ကန်သောဆက်သွယ်မှုကိုပိတ်ပါ

client connection သည်အချက်အလက်လွှဲပြောင်းမှုပြီးဆုံးသောအခါဆက်သွယ်မှုကိုရှင်းလင်းစွာပိတ်ထားရမည်။

 socket_close($client);

မပိတ်မိပါက FD ကိုတစ်ချိန်လုံးလောင်လိမ့်မည်။ client connections အားလုံးကို array တစ်ခုထဲသို့စီမံခန့်ခွဲရန်အကြံပြုသည်။

4 ။ Selection () မြှောက်ဖွဲ့ခြင်းယန္တရားကိုသုံးပါ

ရိုးရိုး ရှင်းရှင်း + 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;
        }
    }
}

5 ။ ဆက်သွယ်မှုကန့်သတ်အရေအတွက်ပါ 0 င်ပါ

တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းဖြစ်ရပ်များတွင် 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;
    }
}

4 ။ အကျဉ်းချုပ်

FD ပင်ပန်းနွမ်းနယ်မှုသည် socket 0 န်ဆောင်မှုများရှိဘုံကျည်ဆံများထဲမှတစ်ခုဖြစ်သည်။ ကြံ့ခိုင်သော socket service တစ်ခုတည်ဆောက်ခြင်းသည် run နိုင်သည့်ကုဒ်ရေးရန်မဟုတ်ပါ, သို့သော်အရေးကြီးသည်မှာစနစ်အရင်းအမြစ်များကိုကျိုးကြောင်းဆီလျော်စွာစီမံခန့်ခွဲရန်နှင့်အလားအလာရှိသောအန္တရာယ်များကိုကာကွယ်ရန်ဖြစ်သည်။

သင်၏ Socket Project တွင်သင် societ_accept အမှားအယွင်း () မှားယွင်းသော သို့မဟုတ် "ဖွင့်ထားသောဖိုင်များ" ကိုပြန်ပို့ပါက,