我有以下代码,我想通过传递$redisdb参数连接到2台服务器。不幸的是,第二个实例得到了第一个连接。
$redis = new RedisHandler();
$redis2 = new RedisHandler('redis2'); //this one gets first $redis connection我做错了什么?
class RedisHandler
{
static $db = null;
public function __construct($redisdb = 'redis') {
// opening db connection
return self::connect($redisdb);
}
static public function connect($redisdb)
{
global $config;
if (self::$db === null)
{
try {
$redisClient = new Redis();
$redisClient -> connect($config[$redisdb]['host'], $config[$redisdb]['port'], $config[$redisdb]['timeout'], null, $config[$redisdb]['reservedInterval'] );
$redisClient->setOption(Redis::OPT_READ_TIMEOUT, 100);
if (!$redisClient) { throw new Exception("Can't connect to Redis"); }
} catch (Exception $e) {
die('Failed to connect to Redis '.$e->getMessage());
}
self::$db = $redisClient;
return self::$db;
//return $m;
}
else
{
// return self::$db;
return self::$db;
}
}
}发布于 2017-05-04 21:18:49
RedisHandler类是基于单例模式开发的,即如果连接已经存在,则返回现有的连接,因此您将面临这个问题。
您可以使用并关闭第一个连接,然后使用第二个连接来解决问题。
发布于 2017-05-04 21:43:55
只要变量或函数成员与对象的当前实例无关,就会使用static关键字。
这是你的
static $db对于每个RedisHandler实例都是相同的。
第一次实例化$db是空,但是在第二次实例化时,因为$db是静态代码,所以变量不会是空,所以您不能实例化另一个Redis,因为条件是if ( ===::$db===null)<>E212>
发布于 2018-07-06 04:35:44
我使用PHP和java来实例化产生excel文件的excel类。
$excel =新的Excel (...)
然后我想生成第二个文件。未设置和$excel = null不起作用。
它在以下情况下工作:
$excel = $excel->Excel (...)
https://stackoverflow.com/questions/43783958
复制相似问题