လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ထိရောက်သောဆက်သွယ်မှုစီမံခန့်ခွဲမှုနှင့်ပြုပြင်ခြင်းအောင်မြင်ရန် Socket_Accept () ကိုအသုံးပြုနည်း () ကိုအသုံးပြုနည်း။

ထိရောက်သောဆက်သွယ်မှုစီမံခန့်ခွဲမှုနှင့်ပြုပြင်ခြင်းအောင်မြင်ရန် Socket_Accept () ကိုအသုံးပြုနည်း () ကိုအသုံးပြုနည်း။

M66 2025-05-19

PHP တွင်ပရိုဂရမ်းမင်းကွန်ရက်များက 0 န်ဆောင်မှုခံယူသူများ၏ဆက်သွယ်မှုမျိုးစုံကိုကိုင်တွယ်ခြင်းသည်ဘုံလိုအပ်ချက်ဖြစ်သည်။ ရိုးရာပိတ်ဆို့ခြင်း socket_accept_Accept_Accept () သည် တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုတစ်ခုသာရနိုင်သည်, တစ်ချိန်တည်းတွင်ဆက်သွယ်မှုမျိုးစုံကိုမလုပ်ဆောင်နိုင်ပါ။ Select () function ကိုနှင့်ပေါင်းစပ်ပြီး socket မျိုးစုံသည်တစ်ချိန်တည်းတွင်တစ်ခုတည်းသောလုပ်ငန်းစဉ်တစ်ခုတည်းတွင်တစ်ချိန်တည်းတွင်နားထောင်နိုင်သည်,

ဤဆောင်းပါးသည် Socket_Accept ကို အသုံးပြု. () ကို ထိရောက်စွာအသုံးပြုရမည်ကိုအသေးစိတ်ဖော်ပြရန်နှင့် () ကို Select လုပ်ခြင်း Multi-connection tcp server ဖြင့်ပေါင်းစပ်ရန်။ ဥပမာကုဒ်တွင် URL domain name အားလုံးကို M66.net ဖြင့်အစားထိုးပါ။

1 ။ အဓိကအခြေခံမူများမိတ်ဆက်

  • Socket_Accept () - client connection ကိုလက်ခံပြီး client နှင့်ဆက်သွယ်မှုအတွက် societ အရင်းအမြစ်အသစ်တစ်ခုကိုပြန်ပို့သည်။

  • Select () - Socket အရင်းအမြစ်များအစုတခု၏အခြေအနေပြောင်းလဲမှုများကိုနားထောင်ပြီးမည်သည့် socket များကိုဖတ်နိုင်, ရေးသားခြင်း,

Select () Select () , server သည် sockets ကိုတစ်ပြိုင်နက်တည်းစောင့်ကြည့်ပြီးချိတ်ဆက်ထားသော socket အသစ်များ (connection အသစ်များရရှိရန်အသုံးပြုသော cockets) နှင့် Socket အသစ်များရရှိရန် sockets sockets နှင့် Sockets Sockets Sockets များနှင့်ဆက်သွယ်ထားသောဖောက်သည်များ၏ sockets ။

2 ။ အကောင်အထည်ဖော်မှုအဆင့်များ

  1. နားထောင်ခြင်း socket ကိုဖန်တီးပြီးချည်နှောင်ခြင်းနှင့်ချည်နှောင်ခြင်းနှင့်ဆိပ်ကမ်းကိုနားထောင်ပါ။

  2. နားထောင်ခြင်း socket (select) ကို select လုပ်ခြင်းစာရင်းတစ်ခုအဖြစ် incray တစ်ခုပါ 0 င်သည်။

  3. Socket Everys အားလုံးကိုနားထောင်ရန်အဓိကကွင်းဆက်နှင့် Call Socket_select () ကို ရိုက်ထည့်ပါ။

  4. နားထောင်သူ socket သည် connection အသစ်တစ်ခုကိုလက်ခံရန်နှင့် client socket array သို့ဝင်ရောက်ရန်ဖတ်ရှုနိုင်သော Socket_accept_Accept () call socket_accept () ကိုဖတ်ရှုနိုင်သည့်အခါ, call socket_accept () ကို ဖတ်ရှုနိုင်ပါသည်။

  5. client socket ကိုဖတ်လို့ရတဲ့အခါမှာဒေတာကိုဖတ်တယ်, လုပ်ငန်းစဉ်တွေကိုတောင်းဆိုချက်တွေ,

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

3 ။ နမူနာကုဒ်

 <?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);
                }
            }
        }
    }
}
?>

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

  • Listen Tockets များကို Socket_create , Socket_bind နှင့် Socket_listen ဖြင့်ဖန်တီးထားသည်။

  • ဖြစ်ရပ်များကိုဖတ်ရှုခြင်း ,

  • Monitor Socket ကိုဖတ်ပြီး connection အသစ်ကိုလက်ခံရန်နှင့်စောင့်ကြည့်လေ့လာခြင်းကိုထည့်သွင်းရန် Society_Accept ကို ဖတ်ရှုနိုင်သည့်အတွက် society_acce ကိုရိုက်ထည့်ပါ။

  • client socket ကိုဖတ်နိုင်သည့်အခါဆက်သွယ်မှုပိတ်ထားလျှင်ဒေတာကိုဖတ်ရန်, သယံဇာတသန့်ရှင်းရေးကိုဆိုသည်။

  • တုန့်ပြန်မှုရှိ URL ဒိုမိန်းအမည်အားလုံးကို M66.net ဖြင့်အစားထိုးထားပြီးလိုအပ်ချက်များနှင့်ကိုက်ညီသော M66.net ဖြင့်အစားထိုးထားသည်။

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

Socket_Accept () ကို ပေါင်းစပ်ပြီး () တစ်ခုတည်းသောလုပ်ငန်းစဉ်အတွင်းဆက်သွယ်မှုများစွာကို ရွေးချယ်ခြင်း () ကိုရွေးပါ ။ ဤဖြေရှင်းချက်သည် Multi-threading (သို့) Multi-processing လုပ်ခြင်းသည်ရှုပ်ထွေးမှုကိုရှောင်ရှားပြီးပေါ့ပါးပြီးတစ်ပြိုင်နက်တည်း server ဇာတ်လမ်းများအတွက်သင့်တော်သည်။ အမှန်တကယ်စီမံကိန်းများအနေဖြင့်သင်သည်ပိုမိုအစွမ်းထက်။ ပြောင်း လွယ်ပြင်လွယ်ကွန်ယက် 0 န ဆောင်မှုများရရှိရန်အဖြစ်အပျက်များကိုမောင်းနှင်သည့်မူဘောင်များကိုပေါင်းစပ်နိုင်သည်။

ဤအတွေးအခေါ်များသည်နောက်ခံကွန်ယက် IO မော်ဒယ်လ်ကိုနားလည်ရန်အလွန်အထောက်အကူပြုသည်။

မကြာသေးမီ ဆောင်းပါးများ