PHP တွင်ပရိုဂရမ်းမင်းကွန်ရက်များက 0 န်ဆောင်မှုခံယူသူများ၏ဆက်သွယ်မှုမျိုးစုံကိုကိုင်တွယ်ခြင်းသည်ဘုံလိုအပ်ချက်ဖြစ်သည်။ ရိုးရာပိတ်ဆို့ခြင်း socket_accept_Accept_Accept () သည် တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုတစ်ခုသာရနိုင်သည်, တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုမျိုးစုံကိုမလုပ်ဆောင်နိုင်ပါ။ Select () function ကိုနှင့်ပေါင်းစပ်ပြီး socket မျိုးစုံသည်တစ်ချိန်တည်းတွင်တစ်ခုတည်းသောလုပ်ငန်းစဉ်တစ်ခုတည်းတွင်တစ်ချိန်တည်းတွင်နားထောင်နိုင်သည်,
ဤဆောင်းပါးသည် Socket_Accept ကို အသုံးပြု. () ကို ထိရောက်စွာအသုံးပြုရမည်ကိုအသေးစိတ်ဖော်ပြရန်နှင့် () ကို Select လုပ်ခြင်း Multi-connection tcp server ဖြင့်ပေါင်းစပ်ရန်။ ဥပမာကုဒ်တွင် URL domain name အားလုံးကို M66.net ဖြင့်အစားထိုးပါ။
Socket_Accept () - client connection ကိုလက်ခံပြီး client နှင့်ဆက်သွယ်မှုအတွက် societ အရင်းအမြစ်အသစ်တစ်ခုကိုပြန်ပို့သည်။
Select () - Socket အရင်းအမြစ်များအစုတခု၏အခြေအနေပြောင်းလဲမှုများကိုနားထောင်ပြီးမည်သည့် socket များကိုဖတ်နိုင်, ရေးသားခြင်း,
Select () Select () , server သည် sockets ကိုတစ်ပြိုင်နက်တည်းစောင့်ကြည့်ပြီးချိတ်ဆက်ထားသော socket အသစ်များ (connection အသစ်များရရှိရန်အသုံးပြုသော cockets) နှင့် Socket အသစ်များရရှိရန် sockets sockets နှင့် Sockets Sockets Sockets များနှင့်ဆက်သွယ်ထားသောဖောက်သည်များ၏ sockets ။
နားထောင်ခြင်း socket ကိုဖန်တီးပြီးချည်နှောင်ခြင်းနှင့်ချည်နှောင်ခြင်းနှင့်ဆိပ်ကမ်းကိုနားထောင်ပါ။
နားထောင်ခြင်း socket (select) ကို select လုပ်ခြင်းစာရင်းတစ်ခုအဖြစ် incray တစ်ခုပါ 0 င်သည်။
Socket Everys အားလုံးကိုနားထောင်ရန်အဓိကကွင်းဆက်နှင့် Call Socket_select () ကို ရိုက်ထည့်ပါ။
နားထောင်သူ socket သည် connection အသစ်တစ်ခုကိုလက်ခံရန်နှင့် client socket array သို့ဝင်ရောက်ရန်ဖတ်ရှုနိုင်သော Socket_accept_Accept () call socket_accept () ကိုဖတ်ရှုနိုင်သည့်အခါ, call socket_accept () ကို ဖတ်ရှုနိုင်ပါသည်။
client socket ကိုဖတ်လို့ရတဲ့အခါမှာဒေတာကိုဖတ်တယ်, လုပ်ငန်းစဉ်တွေကိုတောင်းဆိုချက်တွေ,
အထက်ဖော်ပြပါလုပ်ငန်းစဉ်သည်ဆက်သွယ်မှုမျိုးစုံကိုထိရောက်စွာလုပ်ဆောင်နိုင်ရန်အတွက်ဖြိုဖျက်ခဲ့သည်။
<?php
set_time_limit(0);
error_reporting(E_ALL);
// ဖန်တီးTCPစောင့်ရေှာက်socket
$host = '0.0.0.0';
$port = 12345;
$listenSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($listenSocket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($listenSocket, $host, $port);
socket_listen($listenSocket);
echo "ဆာဗာစတင်ခြင်း,စောင့်ရေှာက်端口 $port\n";
// ဖောက်သည်အားလုံးကိုသိမ်းပါsocket
$clients = [];
// 初始စောင့်ရေှာက်socketစောင့်ကြည့်လေ့လာရေးခင်းကျင်းပါ
$readSockets = [$listenSocket];
while (true) {
// array ကူးယူပါ,အကေြာင်းမှာsocket_selectအဲဒါကိုပြုပြင်ပါလိမ့်မယ်
$socketsToRead = $readSockets;
$write = $except = null;
// စောင့်ရေှာက်socketstatus ကိုပြောင်းလဲမှုများ,ဖြစ်ရပ်တစ်ခုဖြစ်ပေါ်သည်အထိပိတ်ပင်တားဆီးမှု
$numChangedSockets = socket_select($socketsToRead, $write, $except, NULL);
if ($numChangedSockets === false) {
echo "socket_select အမှားတစ်ခုဖြစ်ပွားခဲ့သည်\n";
break;
}
foreach ($socketsToRead as $socket) {
// ဆက်သွယ်မှုအသစ်
if ($socket === $listenSocket) {
$newClient = socket_accept($listenSocket);
if ($newClient !== false) {
// 新客户端စောင့်ကြည့်လေ့လာရေးခင်းကျင်းပါ
$readSockets[] = $newClient;
$clients[(int)$newClient] = $newClient;
$peerName = '';
socket_getpeername($newClient, $peerName);
echo "ဖောက်သည်အသစ်:$peerName\n";
}
} else {
// client data လုပ်ငန်းစဉ်
$data = @socket_read($socket, 2048, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// client ကို disconnection
echo "client ကို disconnection:" . (int)$socket . "\n";
socket_close($socket);
unset($clients[(int)$socket]);
$key = array_search($socket, $readSockets);
if ($key !== false) {
unset($readSockets[$key]);
}
} else {
$data = trim($data);
if ($data) {
echo "client ကိုဒေတာကိုလက်ခံရရှိခဲ့သည်: $data\n";
// ရိုးရှင်းသောတုံ့ပြန်မှုဥပမာ,ပါဝင်m66.net၏URLသရုပ်ပြ
$response = "HTTP/1.1 200 OK\r\n";
$response .= "Content-Type: text/html; charset=utf-8\r\n\r\n";
$response .= "<html><body>";
$response .= "<h1>အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည် m66.net</h1>";
$response .= "<p>您发送၏内容是:".htmlspecialchars($data)."</p>";
$response .= "<p>访问我们၏主页:<a href='http://m66.net'>m66.net</a></p>";
$response .= "</body></html>";
socket_write($socket, $response);
}
}
}
}
}
?>
Listen Tockets များကို Socket_create , Socket_bind နှင့် Socket_listen ဖြင့်ဖန်တီးထားသည်။
ဖြစ်ရပ်များကိုဖတ်ရှုခြင်း ,
Monitor Socket ကိုဖတ်ပြီး connection အသစ်ကိုလက်ခံရန်နှင့်စောင့်ကြည့်လေ့လာခြင်းကိုထည့်သွင်းရန် Society_Accept ကို ဖတ်ရှုနိုင်သည့်အတွက် society_acce ကိုရိုက်ထည့်ပါ။
client socket ကိုဖတ်နိုင်သည့်အခါဆက်သွယ်မှုပိတ်ထားလျှင်ဒေတာကိုဖတ်ရန်, သယံဇာတသန့်ရှင်းရေးကိုဆိုသည်။
တုန့်ပြန်မှုရှိ URL ဒိုမိန်းအမည်အားလုံးကို M66.net ဖြင့်အစားထိုးထားပြီးလိုအပ်ချက်များနှင့်ကိုက်ညီသော M66.net ဖြင့်အစားထိုးထားသည်။
Socket_Accept () ကို ပေါင်းစပ်ပြီး () တစ်ခုတည်းသောလုပ်ငန်းစဉ်အတွင်းဆက်သွယ်မှုများစွာကို ရွေးချယ်ခြင်း () ကိုရွေးပါ ။ ဤဖြေရှင်းချက်သည် Multi-threading (သို့) Multi-processing လုပ်ခြင်းသည်ရှုပ်ထွေးမှုကိုရှောင်ရှားပြီးပေါ့ပါးပြီးတစ်ပြိုင်နက်တည်း server ဇာတ်လမ်းများအတွက်သင့်တော်သည်။ အမှန်တကယ်စီမံကိန်းများအနေဖြင့်သင်သည်ပိုမိုအစွမ်းထက်။ ပြောင်း လွယ်ပြင်လွယ်ကွန်ယက် 0 န ် ဆောင်မှုများရရှိရန်အဖြစ်အပျက်များကိုမောင်းနှင်သည့်မူဘောင်များကိုပေါင်းစပ်နိုင်သည်။
ဤအတွေးအခေါ်များသည်နောက်ခံကွန်ယက် IO မော်ဒယ်လ်ကိုနားလည်ရန်အလွန်အထောက်အကူပြုသည်။