Redisによるタイミングタスクの実現にはcrontabは全く必要ありません

2335 ワード

主な原理
Redisの期限切れ通知イベント1を利用する.redis構成daemonize yes//デーモンここでnotify-keyspace-eventsを構成するパラメータは「Ex」です.xは期限切れイベント2を表す.パッケージredisクラス
redis = new \Redis();
        $this->redis->connect($host, $port);
        $this->setOption();
    }

    public function expire($key = null, $time = 0)
    {
        return $this->redis->expire($key, $time);
    }

    public function psubscribe($patterns = array(), $callback)
    {
        $this->redis->psubscribe($patterns, $callback);
    }

    public function setOption()
    {
        $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
    }
}

3.期限切れの通知を受けるここではtp 5のコマンドモードを使用しています.フレームワークがコマンドモードをサポートすれば便利です.
setName('test')->setDescription('Here is the remark ');
    }
    
    protected function execute(Input $input, Output $output)
    {
        $redis = new MyRedis();
        $redis->psubscribe(array('__keyevent@0__:expired'),
            function ($redis, $pattern, $chan, $msg) use ($output) {
                if ($pattern = '__keyevent@0__:expired' && $msg) {
                    $array = explode('_', $msg);
                    $function = $array['0'];
                    $this->$function($array['1']);
                    $output->writeln($msg);
                }
            });
    }

    /*
     *     
     */
    public function order($id)
    {
        $Order = Order::get($id);
        $a=mt_rand(10000,99999);
        $data['status'] = $a;
        $Order->save($data);
    }

}

4.コマンドをバックグラウンドに掛けてnohup php/home/www/app/think test&jobs#が有効かどうかを確認ps aux|grep php#を実行してから見てもいい.必要な場所で期限切れイベントsetex orderを設定します.1 5 chokingwinするとorderメソッドが自動的にトリガーされ、パラメータは「」後ろの1
注意事項
コードが変更された場合は、killがnohupを削除し、もう一度起動してください.
chokingwinの文章に感謝