Trò chuyện WebSocket PHP

Trò chuyện WebSocket PHP


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

Làm cách nào để lấy dữ liệu từ WebSocket PHP?

socket_recv() có thể được sử dụng để thu thập dữ liệu từ các ổ cắm được kết nối. Ngoài ra, một hoặc nhiều cờ có thể được chỉ định để sửa đổi hành vi của chức năng. dữ liệu được truyền theo tham chiếu, vì vậy nó phải được chỉ định làm biến trong danh sách đối số. Dữ liệu được đọc từ ổ cắm bởi socket_recv() sẽ được trả về trong dữ liệu.

Làm cách nào để sử dụng ổ cắm trong PHP?

Sử dụng Mã .
Bước 1. Đặt các biến như "máy chủ" và "cổng" PHP. .
Bước 2. Tạo ổ cắm. .
Bước 3. Liên kết ổ cắm với cổng và máy chủ. .
Bước 4. Bắt đầu nghe ổ cắm. .
Bước 5. Chấp nhận kết nối đến. .
Bước 6. Đọc tin nhắn từ Client socket. .
Bước 7. Đảo ngược tin nhắn. .
Bước 8. Gửi tin nhắn đến ổ cắm máy khách

Làm cách nào để trò chuyện thời gian thực trong PHP?

Bắt đầu bằng cách tạo chỉ mục. .
Thêm tập lệnh và liên kết vào tiêu đề
Tạo một biểu mẫu Bootstrap cơ bản
Kích hoạt Pusher bằng cách chuyển khóa API
Nhập một kênh duy nhất để đăng ký và ràng buộc sự kiện
Tạo lời gọi AJAX để gửi và nhận dữ liệu vào tin nhắn. tập tin php
Kích hoạt Nhập sự kiện bấm phím để gửi tin nhắn

Tôi có thể sử dụng WebSockets với PHP không?

Bạn có nhiều hơn một mô-đun cho phép bạn triển khai dịch vụ WebSocket trong PHP , trong hướng dẫn này, tôi sẽ sử dụng triển khai Open Swoole của SwooleLabs vì Open Swoole có hỗ trợ . Open Swoole được phát hành thông qua gói PECL, vì vậy bạn có thể cài đặt nó bằng cài đặt PECL.