Maison > Questions et réponses > le corps du texte
<?php
espace de noms app\shop\drive ;
classe Redis {
gestionnaire de $ public ;
fonction publique __construct(){
$redis = nouveau \Redis();
$redisConf = config('cache.redis');
$redis->connect($redisConf['host'], $redisConf['port']);
$redis->auth($redisConf['mot de passe']);
$this->handler = $redis;
}
fonction publique __destruct(){
$this->handler->close();
}
Dans le contrôleur
...
public $redis, $préfixe ;
fonction protégée _initialize(){
$this->initRedis();
var_dump($this->redis->info()); //Erreur, la connexion Redis a été fermée
}
fonction privée initRedis()
{
$redis = nouveau Redis ;
$this->redis = $redis->handler;
var_dump($this->redis->info()); //Normal
$this->prefix = config('cache.redis')['prefix'];
1. Quelle est la raison ?
2. Est-il nécessaire de fermer manuellement la connexion Redis ?
巴扎黑2017-05-16 13:13:43
La méthode
__destruct() est exécutée lorsque l'objet est détruit
public $redis, $prefix;
protected function _initialize(){
$this->initRedis(); //在initRedis()方法中实例Redis对象,当此方法执行完毕,实例出来的Redis对象就会被销毁,同时会执行Redis类中的__destruct方法,redis连接被关闭
var_dump($this->redis->info()); //此时initRedis已经执行完毕,redis连接也已经被关闭
}
private function initRedis()
{
$redis = new Redis;
$this->redis = $redis->handler;
var_dump($this->redis->info()); //正常
$this->prefix = config('cache.redis')['prefix'];
}
En PHP, après l'exécution d'une fonction ou d'une méthode, ses variables internes seront détruites (sauf les variables statiques). Par conséquent, la variable $redis sera détruite après l'exécution de initRedis, et _ dans la classe Redis sera exécuté _destruct(). ), même si vous attribuez le handle à l'attribut redis, la connexion redis a été fermée dans __destruct()