PHP Network Programming တွင် Socket_select function သည် Multiplexing ကိုအကောင်အထည်ဖော်ရန်အတွက်အဓိကကိရိယာတစ်ခုဖြစ်သည် (i / o မြှောက်ခြင်း) ။ ၎င်းသည်ပရိုဂရမ်ကိုတစ်ချိန်တည်းတွင် Socket မျိုးစုံနားထောင်ရန်ခွင့်ပြုသည်, မည်သည့် sockets ကိုဖတ်နိုင်သည်, ဤဆောင်းပါးသည် PHP Network Programming တွင် Socket_select နှင့်၎င်း၏လျှောက်လွှာကိုရှင်းပြရန်လက်တွေ့ကျမှုများကိုပေါင်းစပ်ပါလိမ့်မည်။
Socket_select ကို socket အရင်းအမြစ်များအစုတခုကိုစောင့်ကြည့်လေ့လာပြီးဖတ်ရန်နှင့်စစ်ဆင်ရေးများအတွက်မည်သည့် sockets ကိုအဆင်သင့်ဖြစ်နေသည်ကိုဆုံးဖြတ်ရန်အသုံးပြုသည်။ ရှေ့ပြေးပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -
int socket_select(array &$read, array &$write, array &$except, ?int $tv_sec, ?int $tv_usec = null)
$ ဖတ်ရန် - ဖတ်လို့မရသောစာရင်းကိုနားထောင်ပါ။
$ ရေးရန် - ၎င်း,
$ မှလွဲ ။ - ခြွင်းချက်များကိုနားထောင်သည့် Socket Array
$ tv_sec နှင့် $ tv_usec : အချိန်ကုန် (စက္ကန့်နှင့် microseconds)
အနည်းဆုံး socket တစ်ခုအဆင်သင့်ဖြစ်သည်အထိ function ကိုလုပ်ကွက်များသို့မဟုတ်အချိန်ကုန်တစ်ခုဖြစ်သော,
အမှန်တကယ်ဆာဗာဖွံ့ဖြိုးတိုးတက်မှုတွင်ဖောက်သည်များဆက်သွယ်မှုမျိုးစုံသည်တစ်ချိန်တည်းရောက်ရှိသည့်အခြေအနေကိုကျွန်ုပ်တို့မကြာခဏရင်ဆိုင်လေ့ရှိသည်။ ပိတ်ဆို့ခြင်း socket_accept_accept_Accept ကို အသုံးပြုခြင်းသည်တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုမျိုးစုံကိုတစ်ချိန်တည်းတွင်မကိုင်တွယ်နိုင်ပါ။ Socket_select မှတဆင့်ကျွန်ုပ်တို့လုပ်နိုင်သည် -
တစ်ပြိုင်နက်တည်း client connections မျိုးစုံကိုနားထောင်ပါ
Socket တွင်အချက်အလက်များရှိသည့်အချိန်တွင်အချက်အလက်များကိုအချိန်တိုအတွင်းဖတ်ပါ, ၎င်းသည်ပျင်းရိသောအခါ CPU ကိုပိတ်ဆို့မည်မဟုတ်ပါ
ထိရောက်သောဖြစ်ရပ် - မောင်းနှင်မော်ဒယ်ကိုအကောင်အထည်ဖော်
အောက်ပါဥပမာသည် client connections မျိုးစုံကိုအထောက်အကူပြုသောရိုးရှင်းသော chat room server ကိုအကောင်အထည်ဖော်ရန်နှင့်လူတိုင်းထံသို့စာများထုတ်လွှင့်သည်။
<?php
// ဖန်တီးTCP Socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, "0.0.0.0", 12345);
socket_listen($server);
$clients = [];
echo "chat room server startup chat,ဆိပ်ကမ်းကိုနားထောင်ပါ12345...\n";
while (true) {
// နားထောင်ခြင်းခင်းကျင်းမှုကိုတည်ဆောက်ပါ,ဆာဗာအပါအ 0 င်socketနှင့်အားလုံးဖောက်သည်များsocket
$readSockets = $clients;
$readSockets[] = $server;
// အသုံးပြုsocket_selectReadability ကိုစောင့်ပါsocket
$write = $except = null;
$numChangedSockets = socket_select($readSockets, $write, $except, 0, 200000);
if ($numChangedSockets === false) {
echo "socket_select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
break;
} elseif ($numChangedSockets > 0) {
// ဆက်သွယ်မှုအသစ်ကိုနားထောင်ပါ
if (in_array($server, $readSockets)) {
$newClient = socket_accept($server);
if ($newClient !== false) {
$clients[] = $newClient;
$welcomeMsg = "ချက်တင်ခန်းမှကြိုဆိုပါသည်!\n";
socket_write($newClient, $welcomeMsg, strlen($welcomeMsg));
echo "ဖောက်သည်အသစ်သို့ဆက်သွယ်ပါ,လက်ရှိဆက်သွယ်မှုနံပါတ်:" . count($clients) . "\n";
}
// မှreadSocketsဖယ်ရှားခဲ့သည်server socket,ထပ်ခါတလဲလဲအပြောင်းအလဲနဲ့တားဆီး
$key = array_search($server, $readSockets);
unset($readSockets[$key]);
}
// client ကိုမှပေးပို့သောလုပ်ငန်းစဉ်များ
foreach ($readSockets as $sock) {
$data = @socket_read($sock, 2048, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// client ကို connection ကိုပိတ်လိုက်
$key = array_search($sock, $clients);
socket_close($sock);
unset($clients[$key]);
echo "client ကို disconnection,လက်ရှိဆက်သွယ်မှုနံပါတ်:" . count($clients) . "\n";
continue;
}
$data = trim($data);
if ($data) {
echo "မက်ဆေ့ခ်ျကိုလက်ခံရရှိခဲ့သည်: $data\n";
// ဖောက်သည်များအားလုံးကိုထုတ်လွှင့်သောစာများ
foreach ($clients as $client) {
if ($client != $sock) {
socket_write($client, "အသုံးပြုသူတစ် ဦး ကဆိုပါတယ်: $data\n");
}
}
}
}
}
}
socket_close($server);
ဆာဗာသည် TCP Socket ကိုပထမဆုံးဖန်တီးပေးပြီးဆိပ်ကမ်းကိုချည်နှောင်ထားပြီးဆက်သွယ်မှုအတွက်နားထောင်သည်။
အဓိကကွင်းဆက်တွင် ဒေါ်လာ Readsockets တွင် client sockets နှင့် server နားထောင်ခြင်း Sockets ပါ 0 င်သည်။
မည်သည့် socket ကိုဖတ်ရန်မဆို socket_select ကို Socket_select ။
server socket ကိုဖတ်လို့ရပါဆိုရင် client စာရင်းကိုလက်ခံပြီးလက်ခံပြီး 0 န်ဆောင်မှုပေးသည်။
client socket ကိုဖတ်လို့ရပါကအချက်အလက်များကိုဖတ်ရန်အချက်အလက်များကိုဖတ်ပါ။ သို့ဆိုလျှင်ဆက်သွယ်မှုကိုပိတ်လိုက်သည်။
CPU idling ကိုရှောင်ရှားရန် 0.2 စက္ကန့်ကို 0.2 စက္ကန့်ကြာအောင်မပိတ်ပါနှင့်။
Socket_select သည် connection multi-connection multiplexing အတွက်သော့ချက်ဖြစ်သည်, ဆာဗာစွမ်းဆောင်ရည်ကိုပိတ်ဆို့ခြင်းနှင့်တိုးတက်အောင်ပြုလုပ်ခြင်းကိုရှောင်ရှားရန်ဖြစ်သည်။
Multi-client ကိုတစ်ပြိုင်နက်တည်းလုပ်ဆောင်မှုကို socket_select သုံး. အလွယ်တကူအကောင်အထည်ဖော်နိုင်သည်။
chat rooms, အွန်လိုင်းဂိမ်းများ, လက်ငင်းစာတိုပေးပို့ရေးနှင့်အခြား network application scerparios များအတွက်သင့်တော်သည်။
အကယ်. သင်သည်အသေးစိတ်သင်ခန်းစာများနှင့်အမှုများပိုမိုသိလိုပါက PHP Network Programming နှင့် ပတ်သက်. သင်ခန်းစာများကိုသင်ကြည့်ရှုလိုပါက http://gitbox.net/php-network-tuterial