Socket Programming အတွက် PHP ကိုအသုံးပြုသောအခါ developer များစွာသည် Socket_Accept () နှင့် ပထမဆုံးထိတွေ့သောအခါပြ a နာတစ်ခုနှင့်ကြုံတွေ့ရသည်။ ၎င်းသည်အချို့သောအခြေအနေများတွင်တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းသို့မဟုတ်ဆက်သွယ်မှုများစွာကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်သောဖြစ်နိုင်ချေရှိသောအခြေအနေများတွင်ပိတ်ဆို့မှုတစ်ခုဖြစ်လာနိုင်သည်။
ဒီတော့ဘာကြောင့်ဒီလိုဖြစ်ရတာလဲ။ ဤပြ problem နာကိုပိတ်ဆို့ခြင်းနှင့်မဖြေရှင်းနိုင်ရန် socket_select () ကို ကျွန်ုပ်တို့မည်သို့အသုံးပြုနိုင်မည်နည်း။
Socket_Accept () သည်နားထောင်နေသည့် socket မှဆက်သွယ်မှုတောင်းဆိုမှုကိုလက်ခံရန်အသုံးပြုသော function တစ်ခုဖြစ်သည်။ ရှေ့ပြေးပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -
resource socket_accept(resource $socket);
ဤလုပ်ဆောင်မှု၏အနှစ်သာရမှာ - client connection မရှိပါသည့်အခါ၎င်းသည်ဆက်သွယ်မှုမရောက်မချင်းပရိုဂရမ်ကွပ်မျက်မှုကိုပိတ်ဆို့ထားသည် ။ ဒါကငါ / o အပြုအမူကိုပိတ်ဆို့ခြင်းဖြစ်ပါတယ်။
ဤအပြုအမူသည် single-threaded server များအတွက်မနှစ်သက်ပါ။ အကယ်. ဆာဗာသည်ဆက်သွယ်မှုကိုစောင့်နေသည့်အတွက်အခြားအလုပ်များသည်လုံးဝမအောင်မြင်ပါ။
ဤပြ problem နာကိုဖြေရှင်းရန် PHP သည် socket_select () function ကိုထောက်ပံ့ပေးနိုင်သည့် Socket () function ကိုထောက်ပံ့ပေးနိုင်သည်။ မည်သည့် sockets ကိုဖတ်ခြင်း / ရေးခြင်းလုပ်ငန်းများအတွက်အဆင်သင့်ဖြစ်နေသည်။
int socket_select(
array &$read,
array &$write,
array &$except,
int $tv_sec,
int $tv_usec = 0
);
သင်နားထောင်ချင်သော societ ကို ဒေါ်လာဖတ်ရန် နှင့် Call Societ_select () () သို့သင်၌ထားရန်လိုအပ်သည်။ Socket ကိုဖတ်လို့ရတဲ့အခါ (I.E. client convertony quertion တောင်းဆိုမှုတစ်ခုရှိရင်) socket_eselect () ပြန်လာ လိမ့်မယ်,
Socket_select () သုံး. socient_select () ကို အသုံးပြု. sociec_se-side signe server-side signer တစ်ခုရှိသည်။
<?php
set_time_limit(0);
// ဖန်တီး socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
// Non-blocking mode ကိုသတ်မှတ်ပါ(မလုပ်မနေရမဟုတ်သော,အကြံပြုပါသည်)
socket_set_nonblock($server);
$clients = [];
while (true) {
$read_sockets = [$server] + $clients;
$write = $except = [];
// အားလုံးနားထောင်ပါ sockets,အချိန်ကုန် 1 စက်ဏန့်
$changed = socket_select($read_sockets, $write, $except, 1);
if ($changed === false) {
echo "socket_select() အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
break;
}
// ဆက်သွယ်မှုအသစ်တစ်ခုရှိသည်
if (in_array($server, $read_sockets)) {
$client = socket_accept($server);
if ($client !== false) {
socket_getpeername($client, $ip, $port);
echo "ဆက်သွယ်မှုအသစ် {$ip}:{$port}\n";
$clients[] = $client;
}
// မှ read နားထောင်သူကိုစာရင်းမှဖယ်ရှားပါ socket
$key = array_search($server, $read_sockets);
unset($read_sockets[$key]);
}
// ချိတ်ဆက်ထားပြီးသောလုပ်ငန်းစဉ်ဒေတာ
foreach ($read_sockets as $sock) {
$data = @socket_read($sock, 1024, PHP_NORMAL_READ);
if ($data === false || trim($data) === '') {
// client ကို disconnection
$key = array_search($sock, $clients);
unset($clients[$key]);
socket_close($sock);
continue;
}
$data = trim($data);
echo "ဒေတာကိုလက်ခံရရှိခဲ့သည်:{$data}\n";
$response = "မင်းဒါကိုပို့လိုက်တယ်:{$data}\n";
socket_write($sock, $response);
}
}
socket_close($server);
Socket_Accept () သည်ပိတ်ဆို့ခြင်းဖြစ်ပြီးရိုးရှင်းသော,
တစ်ပြိုင်နက်တည်းပံ့ပိုးသောဆာဗာတစ်ခုတည်ဆောက်ရန် socket_select () ကို Socket ၏ stature ကိုနားထောင်ရန်အသုံးပြုသင့်သည်။
Socket_select () သည် socket မျိုးစုံအပေါ် "စောင့်ဆိုင်း" ဖြစ်ရပ်များကို "စောင့်ဆိုင်း" စေရန်ခွင့်ပြုသည်။
ပြောင်းလွယ်ပြင်လွယ်တိုးတက်စေရန် socket_set_set_nonblock () နှင့် တွဲဖက်. အသုံးပြုရန်အကြံပြုသည်။
အထက်ပါနည်းလမ်းများမှတစ်ဆင့်သင်ဟာ Client Connections မျိုးစုံကိုတစ်ချိန်တည်းမှာကိုင်တွယ်နိုင်တဲ့တုန့်ပြန် PHP Socket Server ကိုအကောင်အထည်ဖော်နိုင်ပြီးပိုပြီးရှုပ်ထွေးတဲ့ကွန်ယက်ပရိုဂရမ်အတွက်အခြေခံအုတ်မြစ်ချခြင်း။
အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်ဒိုမိန်းအမည်သို့မဟုတ်လိပ်စာကိုကိုယ်ပိုင် 0 န်ဆောင်မှုလိပ်စာဖြင့်အစားထိုးသည်။