Chào các bạn,
Tôi đang chia sẻ một blog rất thú vị về cách tạo hệ thống trò chuyện bằng php mà không cần sử dụng ajax. Như chúng ta đều biết hệ thống trò chuyện dựa trên ajax trong php không phải là một giải pháp tốt
bởi vì nó làm tăng tải máy chủ và các cuộc gọi xhr dư thừa trên máy chủ của chúng tôi
Thay vào đó, tôi sẽ sử dụng ổ cắm cho tin nhắn đến và gửi tin nhắn cho người dùng khác. Vì vậy, hãy thử chúng bằng cách sử dụng các bước sau
Bước 1. Kiểm tra chéo trong php. ini rằng tiện ích mở rộng ổ cắm được bật
;extension=sockets
extension=sockets
Bước 2. Tạo tệp server.php
Tệp này sẽ xử lý các tin nhắn đến và đi trên các ổ cắm, Thêm các biến sau vào đầu tệp
$host = 'localhost'; $port = '9000'; $null = NULL;
Bước 3. Sau khi thêm các phương thức trợ giúp
Mã sau đây để bắt tay với các kết nối mới đến và mã hóa và giải mã các tin nhắn đến và đi qua các ổ cắm
function send_message($msg)
{
global $clients;
foreach($clients as $changed_socket)
{
@socket_write($changed_socket,$msg,strlen($msg));
}
return true;
}
function unmask($text) {
$length = ord($text[1]) & 127;
if($length == 126) {
$masks = substr($text, 4, 4);
$data = substr($text, 8);
}
elseif($length == 127) {
$masks = substr($text, 10, 4);
$data = substr($text, 14);
}
else {
$masks = substr($text, 2, 4);
$data = substr($text, 6);
}
$text = "";
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i%4];
}
return $text;
}
function mask($text)
{
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($text);
if($length <= 125)
$header = pack('CC', $b1, $length);
elseif($length > 125 && $length < 65536)
$header = pack('CCn', $b1, 126, $length);
elseif($length >= 65536)
$header = pack('CCNN', $b1, 127, $length);
return $header.$text;
}
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
$headers = array();
$lines = preg_split("/
/", $receved_header);
foreach($lines as $line)
{
$line = chop($line);
if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
{
$headers[$matches[1]] = $matches[2];
}
}
$secKey = $headers['Sec-WebSocket-Key'];
$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake
" .
"Upgrade: websocket
" .
"Connection: Upgrade
" .
"WebSocket-Origin: $host
" .
"WebSocket-Location: ws://$host:$port/php-ws/chat-daemon.php
".
"Sec-WebSocket-Accept:$secAccept
";
socket_write($client_conn,$upgrade,strlen($upgrade));
}
Bước 4. Bây giờ hãy thêm đoạn mã sau để tạo ổ cắm tcp/ip liên kết và lắng nghe
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
socket_listen($socket);
$clients = array($socket);
Bây giờ, một vòng lặp vô tận sẽ được sử dụng để xử lý các tin nhắn đến và gửi
while (true) {
$changed = $clients;
socket_select($changed, $null, $null, 0, 10);
if (in_array($socket, $changed)) {
$socket_new = socket_accept($socket); $clients[] = $socket_new;
$header = socket_read($socket_new, 1024); perform_handshaking($header, $socket_new, $host, $port);
socket_getpeername($socket_new, $ip); $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected'))); send_message($response);
$found_socket = array_search($socket, $changed);
unset($changed[$found_socket]);
}
foreach ($changed as $changed_socket) {
while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
{
$received_text = unmask($buf); $tst_msg = json_decode($received_text, true); $user_name = $tst_msg['name']; $user_message = $tst_msg['message']; $user_color = $tst_msg['color'];
$response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color)));
send_message($response_text); break 2; }
$buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
if ($buf === false) { $found_socket = array_search($changed_socket, $clients);
socket_getpeername($changed_socket, $ip);
unset($clients[$found_socket]);
$response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
send_message($response);
}
}
}
socket_close($socket);
Vì vậy, bạn đã sẵn sàng với chương trình ổ cắm phía máy chủ, Bây giờ là lúc chuyển sang phía trước, nơi chúng tôi sẽ triển khai Apis Web Socket phía máy khách do w3c cung cấp,
Bước 5. tạo một tệp có tên là chỉ mục. php để sử dụng giao diện người dùng với mã ban đầu sau
$host = 'localhost'; $port = '9000'; $subfolder = "php_ws/"; $colors = array('#007AFF','#FF7000','#FF7000','#15E25F','#CFC700','#CFC700','#CF1100','#CF00BE','#F00');
$color_pick = array_rand($colors);
Send
Bây giờ, thêm một số kiểu dáng cơ bản trong phần đầu bằng mã sau
Ok Style hiện đã được thiết lập, cần thêm tập lệnh jquery và tạo đối tượng ổ cắm web và xử lý tất cả các sự kiện trên đó như đoạn mã sau cần thêm trước khi đóng thẻ bosy
Ok Tất cả đã được thiết lập, Bây giờ cần chạy máy chủ. php bằng tiện ích php-cli sau, đảm bảo bạn đã cài đặt tiện ích php cli trong hệ thống của mình
________số 8_______
Bây giờ bạn có thể truy cập chỉ mục phía trước. php qua url trình duyệt như sau và xem hộp trò chuyện và trạng thái kết nối, bạn có thể sử dụng cùng một url hoặc trình duyệt khác để kiểm tra hệ thống trò chuyện có hoạt động hay không