javascript - PHP websocket 服务器停止在超过 50~60 个用户
问题描述
我的聊天室有简单的 php web 套接字,它适用于低用户,小于 50,但没有 CPU 使用率,也没有使用内存,但是当用户向上和向上时它会停止工作..
我们在 Ubunto 上运行它:
<?php
define("HOST_NAME","localhost");
define("PORT", "1632");
$null = NULL;
require_once("class.chathandler.php");
$chatHandler = new ChatHandler();
$socketResource = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socketResource, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socketResource, 0, PORT);
socket_listen($socketResource);
$clientSocketArray = array($socketResource);
while (true) {
$newSocketArray = $clientSocketArray;
socket_select($newSocketArray, $null, $null, 0, 10);
if (in_array($socketResource, $newSocketArray)) {
// continue;
$newSocket = socket_accept($socketResource);
// continue;
$clientSocketArray[] = $newSocket;
$header = socket_read($newSocket, 1024);
$chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT);
socket_getpeername($newSocket, $client_ip_address);
$connectionACK = $chatHandler->newConnectionACK($client_ip_address);
$chatHandler->send($connectionACK);
$newSocketIndex = array_search($socketResource, $newSocketArray);
unset($newSocketArray[$newSocketIndex]);
}
foreach ($newSocketArray as $newSocketArrayResource) {
while(socket_recv($newSocketArrayResource, $socketData, 1024, 0) >= 1){
$socketMessage = $chatHandler->unseal($socketData);
$messageObj = json_decode($socketMessage);
$chat_box_message = $chatHandler->createChatBoxMessage($messageObj->chat_user, $messageObj->chat_message);
$chatHandler->send($chat_box_message);
break 2;
}
$socketData = @socket_read($newSocketArrayResource, 1024, PHP_NORMAL_READ);
if ($socketData === false) {
socket_getpeername($newSocketArrayResource, $client_ip_address);
$connectionACK = $chatHandler->connectionDisconnectACK($client_ip_address);
$chatHandler->send($connectionACK);
$newSocketIndex = array_search($newSocketArrayResource, $clientSocketArray);
unset($clientSocketArray[$newSocketIndex]);
}
}
}
socket_close($socketResource);
以及用于连接它的简单 javascript ..
var websocket = new WebSocket("ws://" + ip + ":<?= $model->id ?>");
websocket.onopen = function (event) {
......
当我有几个免费资源时它会停止...... :(也许你有一个更好和陈旧的在线聊天室解决方案.. 提前感谢所有人。
解决方案
推荐阅读
- rust - 函数返回不可变引用,但借用检查器不这么认为
- linux - 从安装了 `docker.sock` 的 docker 容器中查找主机上的开放端口
- android - 如何更改我使用 SNAP 安装的 Android Studio 的超级用户设置
- node.js - 如何配置 Nginx 和 Node 以使用 SSL?
- python - 在另一列中创建基于 INT 的 N 行
- c - 军用时间和标准时间逻辑有效,但时间指示器字符串不起作用
- winapi - MFC:Ctrl-Shift 的加速器不起作用?
- java - 在 Red Hat EAP 7.3 上找不到命名的 JMS 队列
- javascript - puppeteer / chromium:生成 pdf 不同的 div 高度
- sql-server - SSIS在两个表之间复制很慢