recherche

Maison  >  Questions et réponses  >  le corps du texte

Quand __destruct est-il exécuté dans thinkphp5 ?

<?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 ?

世界只因有你世界只因有你2827 Il y a quelques jours450

répondre à tous(1)je répondrai

  • 巴扎黑

    巴扎黑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()

    répondre
    0
  • Annulerrépondre