php写聊天室怎么样,PHP怎样开发聊天室

这次给大家带来的是用PHP来开发聊天室,虽然是一个很简单的聊天室但是也很有参考价值,需要的朋友可以好好研究一下。

首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中。第二,代码中一定要有日志记录和完善的报错并记录报错。言归正传,swoole应该是每个phper必须要了解的,它号称重新定义了php。此聊天室利用了swoole高并发并且异步非阻塞的特点提高了程序的性能。

首先,定义一个 swoole_lock 和 swoole_websocket_server ,并且配置参数,具体参数详情可以去swoole官网查看。public function start()

{

$this->lock = new swoole_lock(SWOOLE_MUTEX);

// 对文件或数组进行锁操作,已达到同步

$this->server = new swoole_websocket_server($this->addr, $this->port);

// swoole提供的Websocket Server

$this->server->set(array(

'daemonize' => 0,

'worker_num' => 4,

'task_worker_num' => 10,

'max_request' => 1000,

'log_file' => ROOT_PATH . 'storage\\logs\\swoole.log'

// swoole日志路径,必须是绝对路径

));

$this->server->on('open', array($this, 'onOpen'));

$this->server->on('message', array($this, 'onMessage'));

$this->server->on('task', array($this, 'onTask'));

$this->server->on('finish', array($this, 'onFinish'));

$this->server->on('close', array($this, 'onClose'));

// 启动服务

$this->server->start();

}

当有客户端链接时,简单记录客户端的信息。public function onOpen($server, $request)

{

$message = array(

'remote_addr' => $request->server['remote_addr'],

'request_time' => date('Y-m-d H:i:s', $request->server['request_time'])

);

write_log($message);

}

当有客户端发送信息时,对信息进行处理。public function onMessage($server, $frame)

{

$data = json_decode($frame->data);

switch ($data->type) {

case 'init':

case 'INIT':

$this->users[$frame->fd] = $data->message;  、

// 记录每个链接的信息,同样不要尝试打印出来看,因为你只能看到自己的链接信息

$message = '欢迎' . $data->message . '加入了聊天室';

$response = array(

'type' => 1, // 1代表系统消息,2代表用户聊天

'message' => $message

);

break;

case 'chat':

case 'CHAT':

$message = $data->message;

$response = array(

'type' => 2, // 1代表系统消息,2代表用户聊天

'username' => $this->users[$frame->fd],

'message' => $message

);

break;

default:

return false;

}

// 将信息交给task处理

$this->server->task($response);

}

public function onTask($server, $task_id, $from_id, $message)

{

// 迭代所有的客户端链接,将消息推送过去。(如果你尝试将 $this->server->connections 打印出来,那么你会发现他是空的。但当时用 foreach 去循环时,它确实有用。)

foreach ($this->server->connections as $fd) {

$this->server->push($fd, json_encode($message));

}

$server->finish( 'Task' . $task_id . 'Finished' . PHP_EOL);

}

最后,当客户端断开链接时,利用锁机制,同步删除客户端信息,并记录日志。public function onClose($server, $fd)

{

$username = $this->users[$fd];

// 释放客户端,利用锁进行同步

$this->lock->lock();

unset($this->users[$fd]);

$this->lock->unlock();

if( $username ) {

$response = array(

'type' => 1, // 1代表系统消息,2代表用户聊天

'message' => $username . '离开了聊天室'

);

$this->server->task($response);

}

write_log( $fd . ' disconnected');

}

服务端完了,下面就是客户端,很简单,只需要用websocket链接就ok!// websocket

let address = 'ws://<?php echo CLIENT_CONNECT_ADDR . ':' . CLIENT_CONNECT_PORT ?>';

let webSocket = new WebSocket(address);

webSocket.onerror = function (event) {

alert('服务器连接错误,请稍后重试');

};

webSocket.onopen = function (event) {

if(!sessionStorage.getItem('username')) {

setName();

}else {

username = sessionStorage.getItem('username')

webSocket.send(JSON.stringify({

'message': username,

'type': 'init'

}));

}

};

webSocket.onmessage = function (event) {

console.log(event);

let data = JSON.parse(event.data);

if (data.type == 1) {

$('#chat-list2').append('

系统消息: ' + data.message + '');

} else if (data.type == 2) {

$('#chat-list2').append('

' + data.username + ': ' + data.message + '');

}

};

webSocket.onclose = function (event) {

alert('散了吧,服务器都关了');

};

相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 PHP Socket 聊天室的代码样例: ``` <?php // 创建一个 TCP/IP socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: " . socket_strerror(socket_last_error()) . "\n"; exit(); } // 绑定 socket 到一个 IP 地址和端口 $address = 'localhost'; $port = 8888; $result = socket_bind($socket, $address, $port); if ($result === false) { echo "socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n"; exit(); } // 监听连接请求 $result = socket_listen($socket, 3); if ($result === false) { echo "socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n"; exit(); } echo "Server started on $address:$port\n"; $clients = array(); while (true) { // 监听所有连接的 socket,看是否有新的连接进来 $read = array_merge(array($socket), $clients); $write = NULL; $except = NULL; $result = socket_select($read, $write, $except, 0); if ($result === false) { echo "socket_select() failed: " . socket_strerror(socket_last_error($socket)) . "\n"; break; } else if ($result > 0) { // 如果有新连接进来,处理连接请求 if (in_array($socket, $read)) { $new_client = socket_accept($socket); if ($new_client !== false) { $clients[] = $new_client; echo "New client joined\n"; } $key = array_search($socket, $read); unset($read[$key]); } // 读取客户端发送的消息 foreach ($read as $client) { $data = socket_read($client, 1024); if ($data === false) { echo "socket_read() failed: " . socket_strerror(socket_last_error($client)) . "\n"; $key = array_search($client, $clients); unset($clients[$key]); socket_close($client); continue; } $data = trim($data); if (!empty($data)) { echo "Received message: $data\n"; // 将消息广播给其他客户端 foreach ($clients as $c) { if ($c === $socket || $c === $client) { continue; } socket_write($c, "$data\n"); } } } } } // 关闭所有连接 foreach ($clients as $client) { socket_close($client); } socket_close($socket); ?> ``` 这个聊天室程序可以同时处理多个客户端连接,并将客户端发送的消息广播给其他客户端。你可以将这个代码保存为一个 PHP 文件,然后在命令行中运行它,即可启动一个简单的 Socket 聊天室

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值