如何使用类函数和init文件获取redis键值

时间:2018-06-11 09:36:52

标签: php redis

在我的项目中,我使用redis。

我有一个包含ip端口和端口的init文件,因此类Datasource用于分析init文件和连接redis。

这是类Datasource.php代码,其中包含函数getRedis():

namespace common;

class Datasource {

public function __construct() {}

public static function getRedis($config_name = NULL, $server_region = 'default') {

    global $config;
    $redis_config = $config['redis'][$config_name];

    if ($config_name && $redis_config && $server_region) {
        $this->_config_name = $config_name;
        $this->_redis_config = $redis_config;
        $this->_server_region = $server_region;

        try {
            $this->_redis = new \Redis();
            $this->_redis->connect($this->_redis_config[$server_region]['host'], $this->_redis_config[$server_region]['port']);
            if($this->_redis_config[$server_region]['password'] && !$this->_redis->auth($this->_redis_config[$server_region]['password'])) {
                $this->_redis = null;
            }
        } catch (Exception $e) {
            $this->_redis = null;
        }
    } else {
        $this->_redis = null;
    }

    return self::$this->_redis;
   }
 }// end of class Datasource

这是redis.ini.php的初始文件代码

<?php
 $config['redis']['instance1'] = array(
'default' => array(
    'host' => '127.0.0.1',
    'port' => '6379',
    'timeout' => 5,
    'pconnect' => 1,
    'password' => '',
  )
);
 $config['redis']['instance2'] = array(
'default' => array(
    'host' => '127.0.0.1',
    'port' => '6379',
    'timeout' => 5,
    'pconnect' => 1,
    'password' => '',
    )
  );

现在我想获取redis中的xie值,这是我的html代码:

<body style="height:100%" >
<?php 
include "o1ws1v/class/common/Datasource.php";
include 'o1ws1v/conf/redis.ini.php';
$redis_obj = common\Datasource::getRedis('instance1');

$value = $redis_obj->get("xie");
echo "get key xie is:".$value."\n";

?>
</body>

实际上,关键xie应该是zuo。相关结果是一行:&#34;得到关键xie是:zuo&#34;

但它没有表现出来,谁可以帮助我?

1 个答案:

答案 0 :(得分:0)

您在静态方法中使用$this,但您不能。另外,在连接到Redis时会捕获所有异常,因此您无法知道为什么它不会失败。你需要做两件事:

  1. 启用PHP错误(当然只用于开发)
  2. 连接时不要捕获异常,如果你这样做 - 那么记录/保留异常的消息。
  3. 尝试这样的事情:

    <?php
    
    namespace common;
    
    class Datasource
    {
        private static $_redis, $_config_name, $_redis_config, $_server_region;
    
        public static function getRedis($config_name = NULL, $server_region = 'default')
        {
            error_reporting(E_ALL);
            ini_set("display_errors", true);
    
            global $config;
    
            $redis_config = $config['redis'][$config_name];
    
            if (!$config_name || !$redis_config || !$server_region) {
                throw new \Exception('$config_name or $redis_config or $server_region is not set');
            }
    
            if (!$redis_config[$server_region]['password']) {
                throw new \Exception('Redis password is not set');
            }
    
            self::$_config_name = $config_name;
            self::$_redis_config = $redis_config;
            self::$_server_region = $server_region;
    
            self::$_redis = new \Redis();
    
            self::$_redis->connect(self::$_redis_config[$server_region]['host'], self::$_redis_config[$server_region]['port']);
    
            if (!self::$_redis->auth(self::$_redis_config[$server_region]['password'])) {
                throw new \Exception("Can't login to Redis. Check password");
            }
    
            return self::$_redis;
        }
    }
    

    显示代码的错误显然不属于此处,只是为了让您临时查看是否存在任何错误。

    另外,我会添加一个条件来查看Redis是否已经设置,然后返回连接。否则,每次调用getRedis方法时,您都会建立另一个连接。像这样:

    public static function getRedis(...)
    {
        if (!self::$_redis) {
            ...
        }
    
        return self::$_redis;
    }