首页 > 解决方案 > 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) {
......

当我有几个免费资源时它会停止...... :(也许你有一个更好和陈旧的在线聊天室解决方案.. 提前感谢所有人。

标签: javascriptphpubuntuwebsocketsocketserver

解决方案


推荐阅读