လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Multi-Threaded သို့မဟုတ် Multi-process connection connection processing ကိုအကောင်အထည်ဖော်ရန် Socket_Accept ကိုအသုံးပြုနည်း။ (PCNTL_FORK လက်တွေ့ကျသောရှင်းလင်းချက်နှင့်ပေါင်းစပ်)

Multi-Threaded သို့မဟုတ် Multi-process connection connection processing ကိုအကောင်အထည်ဖော်ရန် Socket_Accept ကိုအသုံးပြုနည်း။ (PCNTL_FORK လက်တွေ့ကျသောရှင်းလင်းချက်နှင့်ပေါင်းစပ်)

M66 2025-06-11

PHP တွင် Socket_accept တွင် client connections များကိုကွန်ယက်ပရိုဂရမ်အတွက် Socket ကိုအသုံးပြုသောအခါ client connection များကိုလက်ခံသည့်အဓိကသော့ချက်ဖြစ်သည်။ ဆာဗာ၏တစ်ပြိုင်နက်တည်းလုပ်ဆောင်နိုင်စွမ်းကိုတိုးတက်စေရန်အတွက် connection မျိုးစုံကိုကိုင်တွယ်ရန်အကြောင်းအရာပေါင်းစုံသို့မဟုတ်ဘက်စုံနည်းပညာကိုပေါင်းစပ်ရန်များသောအားဖြင့်ဖြစ်သည်။ PHP သည် Thread မျိုးစုံကိုလူမျိုးပေါင်းစုံကိုထောက်ခံသည့်အတွက်ဤဆောင်းပါးသည် PCNTL_FORK ကို ပေါင်းစပ်ပြီး PCNTL_FORK ကိုပေါင်းစပ်ရန်မည်သို့ပေါင်းစပ်မည်နည်း။

1 ။ အခြေခံသဘောတရားများ

  • Socket_Accept : client connection ကိုစောင့်ပါ။ Societ Resources အသစ်တစ်ခုကိုပြန်ပို့ပါ။

  • PCNTL_FORK : မိဘနှင့်ကလေးဖြစ်စဉ်များသည် code ကိုအပြိုင်ဖြင့် Code ကို execute လုပ်နိုင်သောကလေးဖြစ်စဉ်ကိုဖန်တီးပါ။

  • Multi-process Model - မိဘလုပ်ငန်းစဉ်သည်ဆက်သွယ်မှုကိုလက်ခံသည်။ ဆက်သွယ်မှုကိုလက်ခံရရှိပြီးနောက်ကလေးဖြစ်စဉ်ကို လမ်းဆုံလမ်းခွ မှတစ်ဆင့်ပြုလုပ်သည်။ ကလေးဖြစ်စဉ်ကိုအထူးကိုင်တွယ်နိုင်သည်။ မိဘဖြစ်စဉ်သည်ဆက်သွယ်မှုအသစ်ကိုဆက်လက်နားထောင်နေသည်။

2 ။ ပတ်ဝန်းကျင်ဆိုင်ရာပြင်ဆင်မှု

  • PHP သည် PCNTL extension ကိုဖွင့်ရန်လိုအပ်သည် (များသောအားဖြင့် CLI ဗားရှင်းသည်ပုံမှန်ထောက်ပံ့သည်) လိုအပ်သည်။

  • operating system သည် Unix ကဲ့သို့သော (Linux, Macos), Windows သည် PCNTL_Fork ကို မထောက်ပံ့သောကြောင့်ဖြစ်သည်။

3 ။ နမူနာကုဒ်ရှင်းပြချက်

အောက်တွင်ဖော်ပြထားသည်မှာ multi-process processing processing လုပ်ရန် Socket_accept နှင့် PCNTL_Fork ကို ပေါင်းစပ်ထားသောရိုးရှင်းသော TCP server ၏ဥပမာတစ်ခုဖြစ်သည်။ Code ရှိဒိုမိန်းအမည်အားလုံးကို M66.net ဖြင့်အစားထိုးလိမ့်မည်။

 <?php
set_time_limit(0);
ob_implicit_flush();

$address = '0.0.0.0';
$port = 12345;

// ဖန်တီး TCP socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
    die("socket_create() ဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}

// လိပ်စာနှင့်ဆိပ်ကမ်းချည်နှောင်ခြင်း
if (!socket_bind($sock, $address, $port)) {
    die("socket_bind() ဆုံးရှုံး: " . socket_strerror(socket_last_error($sock)) . "\n");
}

// ဆက်သွယ်မှုကိုနားထောင်ပါ
if (!socket_listen($sock, 5)) {
    die("socket_listen() ဆုံးရှုံး: " . socket_strerror(socket_last_error($sock)) . "\n");
}

echo "ဆာဗာစတင်ခြင်း,စောင့်ရေှာက် $address:$port\n";

while (true) {
    // client connection ကိုလက်ခံပါ,ပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်း
    $client = socket_accept($sock);
    if ($client === false) {
        echo "socket_accept() ဆုံးရှုံး: " . socket_strerror(socket_last_error($sock)) . "\n";
        continue;
    }

    // ဖန်တီး子进程
    $pid = pcntl_fork();

    if ($pid == -1) {
        // ဖန်တီး进程ဆုံးရှုံး
        echo "pcntl_fork() ဆုံးရှုံး\n";
        socket_close($client);
        continue;
    } elseif ($pid == 0) {
        // subprocess ယုတ္တိဗေဒ
        socket_close($sock); // 关闭子进程中စောင့်ရေှာက်socket

        $msg = "အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည် m66.net ဆာဆာ!\n";
        socket_write($client, $msg, strlen($msg));

        // ရိုးရှင်းသော echo processing
        while (true) {
            $buf = socket_read($client, 2048, PHP_NORMAL_READ);
            if ($buf === false || trim($buf) == '') {
                break;
            }
            $response = "မင်းပြောတာက: " . trim($buf) . "\n";
            socket_write($client, $response, strlen($response));
        }

        socket_close($client);
        exit(0); // ကလေးဖြစ်စဉ်ကိုအဆုံးသတ်ပါ
    } else {
        // မိဘလုပ်ငန်းစဉ်ယုတ္တိဗေဒ
        socket_close($client); // မိဘလုပ်ငန်းစဉ်သည်ကလေးကိုပိတ်သည်socket,继续စောင့်ရေှာက်
        pcntl_waitpid(-1, $status, WNOHANG); // ဖုတ်ကောင်ဖြစ်စဉ်များတားဆီး
    }
}

4 ။ ကုဒ်ဖော်ပြချက်

  • အဓိကဖြစ်စဉ်သည်နားထောင်ခြင်း socket ကိုဖန်တီးပြီးဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်သေနေသောကွင်းဆက်တစ်ခုသို့ 0 င်သည်။

  • client_Accept မှတစ်ဆင့် client connections များကိုရယူပါ။

  • ကလေးဖြစ်စဉ်ကိုဖန်တီးရန် PCNTL_FORK ကို သုံးပါ။

  • ကလေးဖြစ်စဉ်သည်နားထောင်ခြင်း socket socket ကိုပိတ်ပြီး 0 န်ဆောင်မှုခံယူသူများကိုအထူးတောင်းဆိုမှုများကိုပြုလုပ်သည်။

  • မိဘလုပ်ငန်းစဉ်သည် client socket ကိုပိတ်ပြီးဆက်သွယ်မှုအသစ်များအတွက်ဆက်လက်နားထောင်နေဆဲဖြစ်သည်။

  • ဖုတ်ကောင်ဖြစ်စဉ်များကိုရှောင်ရှားရန် PCNTL_WAIDPID ကို သုံးပါ။

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

5 ။ မှတ်စုဖို့အရာ

  • အရင်းအမြစ်စီမံခန့်ခွဲမှု - မိဘ - ကလေးဖြစ်စဉ်သည်ဖိုင်ဖော်ပြချက်ယိုစိမ့်မှုကိုရှောင်ရှားရန်မလိုလားအပ်သော socket အရင်းအမြစ်များကိုသီးခြားစီပိတ်ထားသည်။

  • လုပ်ငန်းစဉ်နံပါတ်ထိန်းချုပ်မှု - ထုတ်လုပ်မှုပတ် 0 န်းကျင်သည်အလွန်အကျွံဆာဗာဝန်ကိုရှောင်ရှားရန် subprocesses အရေအတွက်ကိုထိန်းချုပ်ရန်လိုအပ်သည်။

  • အချက်ပြ processing - အမှန်တကယ်စီမံကိန်းများအတွက်ထွက်ရန်နှင့်လျောက်ပတ်စွာပြန်လည်စတင်ရန်အချက်ပြ processing ယန္တရားကိုထည့်ရန်အကြံပြုသည်။

  • Windows ပတ်ဝန်းကျင်ကန့်သတ်ချက်များ - PCNTL_FORK သည် Windows ကိုမထောက်ပံ့ပါ။

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

Socket_Accept နှင့် PCNTLL_Fork တို့ နှင့်ပေါင်းစပ်ပြီး PHP သည်ထိရောက်သော PHP ကိုထိရောက်စွာလုပ်ဆောင်နိုင်သည့်တစ်ပြိုင်တည်းကွန်ယက်ဆာဗာများကိုလည်းအကောင်အထည်ဖော်နိုင်သည်။ PHP သည် C / C ++ ကဲ့သို့သောဘာသာစကားများအဖြစ်ပြောင်းလွယ်ပြင်လွယ်မဟုတ်သော်လည်း Multi-Crowning ၏စည်းကမ်းချက်များအရ Multi-promal Model သည်ရိုးရှင်းလွယ်ကူပြီးအသုံးပြုရန်လွယ်ကူပြီးတည်ငြိမ်သောကွန်ရက် 0 န်ဆောင်မှုများကိုတည်ဆောက်ရန်အလွန်သင့်တော်သည်။

ဤဆောင်းပါး၏နမူနာကုဒ်မှတဆင့် HTTP ဆာဗာများ, chat 0 န်ဆောင်မှုများစသည့်စီးပွားရေးယုတ္တိဗေဒကိုတိုးချဲ့ရန် Multi-process tcp server ကိုလျင်မြန်စွာတည်ဆောက်နိုင်သည်။