0 က်ဘ်အပလီကေးရှင်းများတွင်ဝက်ဘ်ဆိုက်သည် 0 န်ဆောင်မှုခံယူသူနှင့်ဆာဗာအကြားအပြည့်အဝ duplex ဆက်သွယ်ရေးလမ်းကြောင်းကိုတည်ဆောက်ရန်နည်းလမ်းတစ်ခုဖြစ်သည်။ ရိုးရာ HTTP တောင်းဆိုမှုများနှင့်နှိုင်းယှဉ်ပါကဝက်ဘ်ဆိုက်သည်ဆာဗာကို 0 န်ဆောင်မှုခံယူသူအားမက်ဆေ့ခ်ျများတွန်းအားပေးရန်ခွင့်ပြုသည်။ PHP သည်ရိုးရာအဓိပ္ပာယ်ရှိရှည်လျားသောဆက်သွယ်မှုများရှည်လျားသောဆက်သွယ်မှုများအတွက်အသင့်တော်ဆုံးဘာသာစကားမဟုတ်သော်လည်း၎င်းသည် Socket Programming မှတဆင့်ရိုးရှင်းသော websocket 0 န်ဆောင်မှုများကိုအကောင်အထည်ဖော်နိုင်ဆဲဖြစ်သည်။ ဤဆောင်းပါးသည် PHP ၏ Socket_Accept_Accept_Acception function ကိုရှေ့တန်းတင်ထားသော websocket client နှင့်ဆက်သွယ်ရန်မည်သို့အသုံးပြုရမည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။
PHP ၏ Socket လုပ်ဆောင်နိုင်စွမ်းကိုအသုံးပြုရန် Socket Extension ကို PHP တွင်သေချာအောင်ပြုလုပ်ရန်လိုအပ်သည်။ PHPP.ini တွင်ဖွင့်နိုင်သည်။
extension=sockets
ထို့နောက်သင်၏ PHP 0 န်ဆောင်မှုကိုပြန်လည်စတင်ပါ။
Handshake Websont ၏လုပ်ငန်းစဉ်သည်အချို့သော protocol သတ်မှတ်ချက်များကိုလိုက်နာသည်။ ဝက်ဘ်ဆိုက်ဒေတာဆက်သွယ်ရေးကိုမလုပ်ဆောင်မီ 0 န်ဆောင်မှုခံယူသူတောင်းဆိုမှုကိုလက်ခံရရှိပြီးနောက် HTTP protocol-level handshake အတည်ပြုချက်ကိုကျွန်ုပ်တို့လုပ်ဆောင်ရန်လိုအပ်သည်။
ဤတွင်အပြည့်အဝ PHP script ဥပမာတစ်ခုဖြစ်သည်။
<?php
$host = '0.0.0.0';
$port = 8080;
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, $host, $port);
socket_listen($serverSocket);
echo "WebSocket ဆာဗာမှာစတင်သည် $host:$port\n";
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
continue;
}
// client ကိုတောင်းဆိုချက်ကို header ကိုဖတ်ပါ
$request = socket_read($clientSocket, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $request, $matches)) {
$key = trim($matches[1]);
$acceptKey = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers .= "Connection: Upgrade\r\n";
$headers .= "Sec-WebSocket-Accept: $acceptKey\r\n\r\n";
socket_write($clientSocket, $headers);
echo "WebSocket လက်ဆွဲနှုတ်ဆက်ခြင်းပြီးစီးခဲ့သည်。\n";
}
// ရိုးရှင်းသောဖတ်နှင့်ပေးပို့ပါ WebSocket အကေြာင်းကြားချက်
while (true) {
$data = socket_read($clientSocket, 2048);
if ($data === false) {
break;
}
$decoded = unmask($data);
echo "接收到客户端အကေြာင်းကြားချက်: $decoded\n";
$response = mask("မင်းပို့လိုက်တာက: $decoded");
socket_write($clientSocket, $response);
}
socket_close($clientSocket);
}
socket_close($serverSocket);
// သုံးသပ်ကြည့်ရှုခြင်း WebSocket အရိုးစု
function unmask($payload) {
$length = ord($payload[1]) & 127;
if ($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
} elseif ($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
} else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
}
$text = '';
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i % 4];
}
return $text;
}
// ဆောက်လုပ်ပုံ WebSocket 数据အရိုးစု
function mask($text) {
$b1 = 0x81; // FIN=1, opcode=0x1 (text)
$length = strlen($text);
if ($length <= 125) {
$header = pack('CC', $b1, $length);
} elseif ($length <= 65535) {
$header = pack('CCn', $b1, 126, $length);
} else {
$header = pack('CCNN', $b1, 127, 0, $length);
}
return $header . $text;
}
?>
ရှေ့ဆုံးတွင်သင်သည် PHP websocket 0 န်ဆောင်မှုဖြင့်အောက်ပါနည်းလမ်းများဖြင့်ဆက်သွယ်နိုင်သည်။
<script>
const socket = new WebSocket("ws://m66.net:8080");
socket.onopen = () => {
console.log("ဆက်သွယ်မှုကိုထူထောင်ထားသည်");
socket.send("မင်္ဂလာပါ PHP WebSocket!");
};
socket.onmessage = (event) => {
console.log("收到အကေြာင်းကြားချက်:", event.data);
};
socket.onclose = () => {
console.log("ဆက်သွယ်မှုပိတ်ထားသည်");
};
</script>
မှတ်ချက်: Ws: //m66.net: 8080 ဤတွင်သင်၏ဆာဗာ၏လိပ်စာဖြစ်သည်။ Domain Name နှင့် Port Mappping ကိုဖြန့်ကျက်သောပတ်ဝန်းကျင်နှင့်အညီသတ်မှတ်ထားပါ။
PHP ၏ Socket_Acy_Accept နှင့်ဆက်စပ်သောလုပ်ဆောင်ချက်များကိုအသုံးပြုခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် Basic Websound server logic ကိုအကောင်အထည်ဖော်နိုင်သည်။ ဤနည်းလမ်းသည်သင်ယူခြင်းနှင့်စမ်းသပ်ရန်အတွက်သင့်တော်သည်။ ထုတ်လုပ်မှုပတ် 0 န်းကျင်အတွက် Ratchet, Swatchet, Swatchet, Swatche, SWOOLE SWOOCKER (ဥပမာ node.js, Go) ကိုသုံးပါ။
PHP သည်ရှည်လျားသောဆက်သွယ်မှုများအတွက်ဒီဇိုင်းရေးဆွဲခြင်းမဟုတ်သော်လည်း၎င်း၏အခြေခံ socket သည်အစွမ်းထက်ပြီးအခြေခံဘိလပ်မြေဆက်သွယ်ရေးဆက်သွယ်ရေးလိုအပ်ချက်များကိုဖြည့်ဆည်းပေးနိုင်သည်။ ဒီဆောင်းပါးမှာဥပမာတွေကတော့ front-end client နဲ့အပြန်အလှန်ဆက်သွယ်ဖို့ရိုးရှင်းတဲ့ PHP websound server ကိုတည်ဆောက်နိုင်တယ်။