PHP websocket 服务器在超过 50~60 个用户时停止

问题描述

我的聊天室有一个简单的 PHP web socket,它适用于低用户,小于 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,PORT);

socket_listen($socketResource);

$clientSocketArray = array($socketResource);
while (true) {
    $newSocketArray = $clientSocketArray;

    socket_select($newSocketArray,$null,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,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) {
......

我有几个免费资源时它就停止了...... :( 也许你有一个更好的、陈旧的在线聊天室解决方案.. 提前谢谢大家。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...