然后观察一段时间workerman.log看是否有process_timeout异常
*/
//declare(ticks=1);
use Workerman\Redis\Client;
/**
聊天主逻辑
主要是处理 onMessage onClose
*/
class Events
{
public static function onWorkerStart($businessWorker){
global $redis;
$redis = new Client('redis://'.Common::getEnv("REDIS.REDIS_HOST").':'.Common::getEnv("REDIS.REDIS_PORT"));
}
/**
有消息时
@param int $client_id
@param mixed $message
*/
public static function onMessage($client_id, $message)
{
try {
global $redis;
$key = 'live_socket_user_online';
$redis->incr($key, function ($result, $redis) {
var_dump($result);
});
} catch (\Exception $e) {
file_put_contents("TCP连接错误JSON.txt", json_encode([$e]) . "\n", 8);
}
}
用redis扩展。在onWorkerStart里初始化redis,不要在其它地方初始化redis。
<?php
/**
*/
/**
*/
//declare(ticks=1);
use Workerman\Redis\Client;
/**
*/
class Events
{
public static function onWorkerStart($businessWorker){
global $redis;
$redis = new Client('redis://'.Common::getEnv("REDIS.REDIS_HOST").':'.Common::getEnv("REDIS.REDIS_PORT"));
}
/**
*/
public static function onMessage($client_id, $message)
{
try {
global $redis;
$key = 'live_socket_user_online';
$redis->incr($key, function ($result, $redis) {
var_dump($result);
});
} catch (\Exception $e) {
file_put_contents("TCP连接错误JSON.txt", json_encode([$e]) . "\n", 8);
}
}
}
是这样吗?
是因为异步的原因造成的 incr 结果不连贯吗?
wokerman/redis是用于redis异步订阅的。除此之外请使用redis扩展,不要用wokerman/redis
wokerman中无法使用redis连接池?
redis扩展是同步阻塞模式,用不到连接池。单例是性能最好的。
如果万人同时在线,redis链接会同步阻塞掉,导致后进入的人无法连接redis,整个聊天系统崩溃掉
这种情况只能搞redis分布式?
redis足够快,单机1秒可以支持几万请求,每个请求都是几毫秒级别,基本上和非阻塞一样快,不用担心。
还有并不是万人在线就有一万个redis连接,redis连接数和进程数一致,比如你开了32个进程,那么只有32个redis连接,并且连接是长连接,一直复用的,不会出现redis连接数过多无法连接redis的情况。
好的 感谢解答