我现在只知道:以下两部分,但是不知如何将两者结合?让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);
参考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个客户端连接到同一个端口时,可能会出现资源耗尽的问题。为了解决这个问题,你可以考虑使用多线程或其它技术来处理客户端连接。