လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_Accept ဖြင့်ရရှိသော connection တစ်ခုနှင့် connection ကိုကြွေးကြော်စွာပိတ်ရန်

Socket_Accept ဖြင့်ရရှိသော connection တစ်ခုနှင့် connection ကိုကြွေးကြော်စွာပိတ်ရန်

M66 2025-05-19

PHP, Socket_Accept ကို အသုံးပြု. Socket-based server application တစ်ခုတည်ဆောက်သည့်အခါ client မှ connection တောင်းဆိုမှုများကိုလက်ခံသည့် conse connection များကိုလက်ခံသည့်အလွန်အဓိကလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ သို့သော်ဆက်နွယ်မှုစီမံခန့်ခွဲမှုစနစ်တကျမကိုင်တွယ်နိုင်ပါကသယံဇာတယိုစိမ့်မှုနှင့်ပုံမှန်မဟုတ်သော 0 န်ဆောင်မှုရပ်စဲခြင်းပင်ဖြစ်ရန်လွယ်ကူသည်။ ဤဆောင်းပါးသည်အရင်းအမြစ်များကိုအချိန်တိုအတွင်းဖြန့်ချိခြင်းနှင့် 0 န်ဆောင်မှုများ၏တည်ငြိမ်မှုနှင့်ယုံကြည်စိတ်ချရမှုကိုထိန်းသိမ်းရန်သေချာစေရန်ဤဆက်သွယ်မှုများကိုမည်သို့ပြုလုပ်နိုင်သည်ကိုလေ့လာလိမ့်မည်။

1 ။ Socket_Accept ကိုအခြေခံအသုံးပြုခြင်း ()

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)

2 ။ ပြ problem နာ၏အမြစ်အကြောင်းရင်းကိုခွဲခြမ်းစိတ်ဖြာခြင်း

PHP's Socket_Accept_Accept () သည် ပိတ်ဆို့ခြင်း function တစ်ခုဖြစ်သည်။ ဤအပြုအမူသည် 0 န်ဆောင်မှုကိုထွက်ပြေးခြင်း, အကယ်. အရင်းအမြစ်ကိုမှန်ကန်စွာထုတ်ပြန်ခြင်းမရှိပါက၎င်းကိုဖြစ်ပေါ်နိုင်သည်။

  1. Socket_Close () ကွပ်မျက်ခံရခြင်းမရှိပါ ။ connection ကိုမပိတ်နိုင်ပါ။ စနစ်အရင်းအမြစ်များကိုထုတ်ပြန်ခြင်းမရှိပါ။

  2. ဇာတ်ညွှန်းသည်ပုံမှန်မဟုတ်သောအရာများဖြစ်ပေါ်လာသည် - ဖန်တီးထားသောဆက်သွယ်မှုကိုမသန့်ရှင်းစေပါ။ ဖုတ်ကောင် Socket နောက်သို့ထားခဲ့သည်။

  3. Signal Interupte (ဥပမာ Ctrl + C အဖြစ်) - အဘယ်သူမျှမနောက်ဆက်တွဲအဘယ်သူမျှမ။

3 ။ ကြော့ရှင်းပိတ်သိမ်းမှုအတွက်အဓိကနည်းပညာများ

1 ။ stream_socket_server () ကို socket_create အစား ()

Socket_ * စီးရီးများသည်အဆင့်နိမ့်ထိန်းချုပ်မှုကိုပေးသော်လည်း PHP ၏ stream_socket_server () သည် အချိန်ကုန်ထိန်းချုပ်မှုနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သောအပြုအမူများကိုအကောင်အထည်ဖော်ရန်ပိုမိုလွယ်ကူသည်။

သို့သော် Socket_ * * * * * * * ကိုအပြင်းအထန်တောင်းဆိုပါကအောက်ပါနည်းလမ်းများသည်ကြော့ရှင်းသောပိတ်သိမ်းခြင်းကိုရရှိနိုင်ပါသည်။

2 ။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode + signal ကိုစောင့်ကြည့်လေ့လာခြင်းကိုသတ်မှတ်ပါ

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

3 ။ Select လုပ်ပါ

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 များအကောင်အထည်ဖော်ရန်အတွက်အချိန်မီအကြားရှိအချက်ပြချက်များကိုအနှောင့်အယှက်ပေးနိုင်သည်။

4 ။ သယံဇာတများသန့်ရှင်းရေးအကြံပြုချက်များ

Socket_create () နှင့် Socket_accept မှရရှိသောအရင်းအမြစ်တစ်ခုစီသည် တွဲဖက် . () တွဲဖက်ခြင်းနှင့်ကွပ်မျက်ခံရသည်။ ကောင်းမွန်စွာဖွဲ့စည်းထားသော Socket Service Life Cyle သည်အောက်ပါအတိုင်းဖြစ်သည် -

  1. Socket ကိုအစပြုပါ

  2. Non-blocking / select ကို set

  3. အဓိကကွင်းဆက်နှင့်လုပ်ငန်းစဉ်တောင်းဆိုမှုများတွင်ဆက်သွယ်မှုကိုရယူပါ

  4. အဆိုပါရပ်စဲ signal ကိုဖမ်းယူနှင့်ကွင်းဆက်ထွက်ပါ

  5. ပွင့်လင်းသောဆက်သွယ်မှုအားလုံးကိုရှင်းလင်းပါ

  6. နောက်ဆုံးတော့နားထောင်ခြင်း socket ကိုပိတ်ပါ

V. ပြီးပြည့်စုံသောဥပမာ

ဤတွင် 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";

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

PHP မှပေးသော Socket Programming interface သည်အင်အားကြီးမားသော်လည်းအရင်းအမြစ်စီမံခန့်ခွဲမှု၏ရှုပ်ထွေးမှုကိုဖြစ်ပေါ်စေသည်။ ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ခြင်းဖြင့်ရပ်စဲခြင်းအချက်ပြချက်များကိုနားထောင်ခြင်းဖြင့် Socket_select () နှင့်အခြားနည်းလမ်းများဖြင့်နားထောင်ခြင်းကိုနားထောင်ခြင်းဖြင့် "လှပသော shutdown" ကို အသုံးပြု. PHP တွင်ရရှိနိုင်ပါသည်။ PHP တွင်ရရှိမည်ဖြစ်သည်။ ရှည်လျားသော 0 န်ဆောင်မှုများကိုတည်ဆောက်ရာတွင်ဤနည်းလမ်းများသည်အထူးအရေးကြီးသည်။

အောက်ဖော်ပြပါအချက်များအပါအဝင်သင်ဖွင့်ထားသည့်အရင်းအမြစ်တိုင်းကိုအမြဲတမ်းထုတ်ပေးပါ။