使用PHP Redis客户端,在应用程序的每个PHP脚本中创建新的$ connection对象,还是创建一个GLOBAL $连接对象?

时间:2018-02-19 06:01:16

标签: php redis predis

在我的PHP应用程序中,我正在尝试使用Redis(而不是Predis,Redis的PHP客户端)进行数据缓存,为此我正在关注this tutorial.

现在我需要在一个PHP脚本/页面中将数据存储在缓存中。为此,我将创建一个Predis客户端对象 $redis ,然后使用此$redis对象调用其功能,如 set() expire() 就可以将数据存储为键值对。下面给出了一个示例代码段。

现在的问题是,在另一个PHP脚本/页面中,我需要读取存储在缓存中的数据。为此,我需要再次在get()对象上调用 exists() $redis 等函数。< / em>的

现在我的问题是,在第二个PHP脚本/页面中,我应该创建一个新的Predis客户端对象,如上面提到的$redis(然后我需要每次都需要创建一个新的$ redis对象在新的PHP脚本/页面中访问存储在缓存中的数据),或者我应该将第一个声明为 GLOBAL ,以便可以从我的Web中的所有PHP脚本/页面访问它应用?什么是正确的做法

示例PHP第一个脚本:

<?php
require "predis/autoload.php";
PredisAutoloader::register();
try {
    $redis = new PredisClient();
}
catch (Exception $e) {
    die($e->getMessage());
}
// sets message to contian "Hello world"
$redis->set('message', 'Hello world');
?>

示例PHP第二个脚本:

<?php
/* THE FOLLOWING PART WHICH CREATES A $redis 
OBJECT SEEMS TO BE AN OVERDO. SHOULDN'T WE BE 
USING THE SAME $redis OBJECT FROM THE ABOVE SNIPPET? */


require "predis/autoload.php";
PredisAutoloader::register();
try {
    $redis = new PredisClient();
}
catch (Exception $e) {
    die($e->getMessage());
}

// gets the value of message
$value = $redis->get('message');
?>

2 个答案:

答案 0 :(得分:0)

答案实际上取决于Web应用程序的复杂性。一个可以轻松实现的简单方法是创建一个单例类并在该类中使用静态变量。

class MyRedis {
    private static $redis;
    static function shared() {
        if ( empty(self::$redis) ) {
            try {
                self::$redis = new PredisClient();
            } catch (Exception $e) {
                die($e->getMessage());
            }
        }
        return self::$redis;
    }
}

现在,当你需要你的对象时,你可以这样做:

$myRedisObject = MyRedis::shared();
// or 
$message = MyRedis::shared()->get('message');

如果还没有这样做的话,它会成为一个。

答案 1 :(得分:0)

您可能不需要这样做 - 您可以运行一些测试来检查,但根据Predis docs

  

与Redis的连接是懒惰的,意味着客户端连接到   服务器仅在需要时。虽然建议让   客户在引擎盖下做自己的事情,有时可能会这样   仍然希望控制何时打开连接或   关闭:这可以通过调用$ client-&gt; connect()和来轻松实现   $客户端 - &GT;断开()

这也取决于你正在建立多少连接 - 它可能是一个过度工程的情况,因为连接开销,而实际,是非常低。

我还假设在您的示例中,两个脚本都包含在一个请求中。您可以使用某种消息传递/缓存组件将数据存储在Redis中,并使其可用于本地脚本环境,这取决于您的数据要求的具体情况。