PHP တွင် Socket_accept တွင် client connections များကိုကွန်ယက်ပရိုဂရမ်အတွက် Socket ကိုအသုံးပြုသောအခါ client connection များကိုလက်ခံသည့်အဓိကသော့ချက်ဖြစ်သည်။ ဆာဗာ၏တစ်ပြိုင်နက်တည်းလုပ်ဆောင်နိုင်စွမ်းကိုတိုးတက်စေရန်အတွက် connection မျိုးစုံကိုကိုင်တွယ်ရန်အကြောင်းအရာပေါင်းစုံသို့မဟုတ်ဘက်စုံနည်းပညာကိုပေါင်းစပ်ရန်များသောအားဖြင့်ဖြစ်သည်။ PHP သည် Thread မျိုးစုံကိုလူမျိုးပေါင်းစုံကိုထောက်ခံသည့်အတွက်ဤဆောင်းပါးသည် PCNTL_FORK ကို ပေါင်းစပ်ပြီး PCNTL_FORK ကိုပေါင်းစပ်ရန်မည်သို့ပေါင်းစပ်မည်နည်း။
Socket_Accept : client connection ကိုစောင့်ပါ။ Societ Resources အသစ်တစ်ခုကိုပြန်ပို့ပါ။
PCNTL_FORK : မိဘနှင့်ကလေးဖြစ်စဉ်များသည် code ကိုအပြိုင်ဖြင့် Code ကို execute လုပ်နိုင်သောကလေးဖြစ်စဉ်ကိုဖန်တီးပါ။
Multi-process Model - မိဘလုပ်ငန်းစဉ်သည်ဆက်သွယ်မှုကိုလက်ခံသည်။ ဆက်သွယ်မှုကိုလက်ခံရရှိပြီးနောက်ကလေးဖြစ်စဉ်ကို လမ်းဆုံလမ်းခွ မှတစ်ဆင့်ပြုလုပ်သည်။ ကလေးဖြစ်စဉ်ကိုအထူးကိုင်တွယ်နိုင်သည်။ မိဘဖြစ်စဉ်သည်ဆက်သွယ်မှုအသစ်ကိုဆက်လက်နားထောင်နေသည်။
PHP သည် PCNTL extension ကိုဖွင့်ရန်လိုအပ်သည် (များသောအားဖြင့် CLI ဗားရှင်းသည်ပုံမှန်ထောက်ပံ့သည်) လိုအပ်သည်။
operating system သည် Unix ကဲ့သို့သော (Linux, Macos), Windows သည် PCNTL_Fork ကို မထောက်ပံ့သောကြောင့်ဖြစ်သည်။
အောက်တွင်ဖော်ပြထားသည်မှာ 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); // ဖုတ်ကောင်ဖြစ်စဉ်များတားဆီး
}
}
အဓိကဖြစ်စဉ်သည်နားထောင်ခြင်း socket ကိုဖန်တီးပြီးဆက်သွယ်မှုကိုစောင့်ဆိုင်းရန်သေနေသောကွင်းဆက်တစ်ခုသို့ 0 င်သည်။
client_Accept မှတစ်ဆင့် client connections များကိုရယူပါ။
ကလေးဖြစ်စဉ်ကိုဖန်တီးရန် PCNTL_FORK ကို သုံးပါ။
ကလေးဖြစ်စဉ်သည်နားထောင်ခြင်း socket socket ကိုပိတ်ပြီး 0 န်ဆောင်မှုခံယူသူများကိုအထူးတောင်းဆိုမှုများကိုပြုလုပ်သည်။
မိဘလုပ်ငန်းစဉ်သည် client socket ကိုပိတ်ပြီးဆက်သွယ်မှုအသစ်များအတွက်ဆက်လက်နားထောင်နေဆဲဖြစ်သည်။
ဖုတ်ကောင်ဖြစ်စဉ်များကိုရှောင်ရှားရန် PCNTL_WAIDPID ကို သုံးပါ။
ကြိုဆိုသောမက်ဆေ့ခ်ျနှင့်ပဲ့တင်သံ function ကိုကလေးဖြစ်စဉ်တွင်အကောင်အထည်ဖော်သည်။
အရင်းအမြစ်စီမံခန့်ခွဲမှု - မိဘ - ကလေးဖြစ်စဉ်သည်ဖိုင်ဖော်ပြချက်ယိုစိမ့်မှုကိုရှောင်ရှားရန်မလိုလားအပ်သော socket အရင်းအမြစ်များကိုသီးခြားစီပိတ်ထားသည်။
လုပ်ငန်းစဉ်နံပါတ်ထိန်းချုပ်မှု - ထုတ်လုပ်မှုပတ် 0 န်းကျင်သည်အလွန်အကျွံဆာဗာဝန်ကိုရှောင်ရှားရန် subprocesses အရေအတွက်ကိုထိန်းချုပ်ရန်လိုအပ်သည်။
အချက်ပြ processing - အမှန်တကယ်စီမံကိန်းများအတွက်ထွက်ရန်နှင့်လျောက်ပတ်စွာပြန်လည်စတင်ရန်အချက်ပြ processing ယန္တရားကိုထည့်ရန်အကြံပြုသည်။
Windows ပတ်ဝန်းကျင်ကန့်သတ်ချက်များ - PCNTL_FORK သည် Windows ကိုမထောက်ပံ့ပါ။
Socket_Accept နှင့် PCNTLL_Fork တို့ နှင့်ပေါင်းစပ်ပြီး PHP သည်ထိရောက်သော PHP ကိုထိရောက်စွာလုပ်ဆောင်နိုင်သည့်တစ်ပြိုင်တည်းကွန်ယက်ဆာဗာများကိုလည်းအကောင်အထည်ဖော်နိုင်သည်။ PHP သည် C / C ++ ကဲ့သို့သောဘာသာစကားများအဖြစ်ပြောင်းလွယ်ပြင်လွယ်မဟုတ်သော်လည်း Multi-Crowning ၏စည်းကမ်းချက်များအရ Multi-promal Model သည်ရိုးရှင်းလွယ်ကူပြီးအသုံးပြုရန်လွယ်ကူပြီးတည်ငြိမ်သောကွန်ရက် 0 န်ဆောင်မှုများကိုတည်ဆောက်ရန်အလွန်သင့်တော်သည်။
ဤဆောင်းပါး၏နမူနာကုဒ်မှတဆင့် HTTP ဆာဗာများ, chat 0 န်ဆောင်မှုများစသည့်စီးပွားရေးယုတ္တိဗေဒကိုတိုးချဲ့ရန် Multi-process tcp server ကိုလျင်မြန်စွာတည်ဆောက်နိုင်သည်။