柯基小短腿 2017-09-10 11:11 采纳率: 0%
浏览 544

最多有2000个点同时与服务器互传数据。用PHPredis队列socket,请大神写个示例代码

我现在只知道:以下两部分,但是不知如何将两者结合?让redis来处理socket的2000个连接?请大神帮我结合下,写个基本的样板我参考下,谢谢啦!

redis的基础代码:

//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//存储数据到列表中
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
// 获取存储的数据并输出
$arList = $redis->lrange("tutorial-list", 0 ,5);
echo "Stored string in redis";
print_r($arList);

//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
// 获取数据并输出
$arList = $redis->keys("*");
echo "Stored keys in redis:: ";
print_r($arList);

socket部分:
set_time_limit(0);

$ip = '0.0.0.0';

$port = 8081;

do {

if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {

echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";

}

if(($ret = socket_bind($sock,$ip,$port)) < 0) {

echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";

}

if(($ret = socket_listen($sock,4)) < 0) {

echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";

}

if (($msgsock = socket_accept($sock)) < 0) {  
    echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";  
    break;  
} else {            
    $msg = "\nPHP Test Server. \n" ."用quit,shutdown,sun等命令测试.\n";  
    socket_write($msgsock, $msg, strlen($msg)); 
    socket_last_error();   
    do{
        if(false ===($buf = socket_read($msgsock,8192))){
        echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";  
                break 2; 
        } 
        if (!$buf = trim($buf)) {  
            continue;  
    }  
    if ($buf == 'sun') {  
            echo'what are you doing?'; 

            $msg = "\nPHP Test Server. \n" ."what are you doing?.\n";  
        socket_write($msgsock, $msg, strlen($msg));  
    }  
    if ($buf == 'quit') {  
            break;      /*服务器还在监听*/
    }  
    if ($buf == 'shutdown') {  
            socket_close($msgsock);  
            break 2;    /*服务器已经断开连接*/
    }                     
    $talkback = "receive:" . $buf;  
    socket_write($msgsock, $talkback, strlen($talkback));
    echo $talkback . '<br /n>';
    }while(true);

}  
//socket_close($msgsock);      

} while (true);

//socket_close($sock);

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 10:34
    关注

    参考GPT和自己的思路:

    可以使用下面的示例代码将redis和socket结合使用:

    set_time_limit(0);

    $ip = '0.0.0.0';

    $port = 8081;

    $redis = new Redis();

    $redis->connect('127.0.0.1', 6379);

    do {

    if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {

    echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";

    }

    if(($ret = socket_bind($sock,$ip,$port)) < 0) {

    echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";

    }

    if(($ret = socket_listen($sock,4)) < 0) {

    echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";

    }

    if (($msgsock = socket_accept($sock)) < 0) {

    echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";

    break;

    } else {

    $msg = "\nPHP Test Server. \n" ."用quit,shutdown,sun等命令测试.\n";

    socket_write($msgsock, $msg, strlen($msg));

    socket_last_error();

    do{

    if(false ===($buf = socket_read($msgsock,8192))){

    echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";

    break 2;

    }

    if (!$buf = trim($buf)) {

    continue;

    }

    if ($buf == 'sun') {

    echo'what are you doing?';

    $msg = "\nPHP Test Server. \n" ."what are you doing?.\n";

    socket_write($msgsock, $msg, strlen($msg));

    }

    if ($buf == 'quit') {

    break;

    }

    if ($buf == 'shutdown') {

    socket_close($msgsock);

    break 2;

    }

    $talkback = "receive:" . $buf;

    $redis->lpush("socket:messages", $talkback);

    echo $talkback . '<br /n>';

    } while(true);

    }

    } while (true);

    //socket_close($msgsock);

    使用这个示例代码,当socket接受到数据时,它会将消息压入一个名为“socket:messages”的redis队列中。你可以使用以下代码从队列中读取消息:

    $redis->rpop("socket:messages");

    但是,这个例子还有一些问题需要解决。当有2000个客户端连接到同一个端口时,可能会出现资源耗尽的问题。为了解决这个问题,你可以考虑使用多线程或其它技术来处理客户端连接。

    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错