• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

php异步处理任务使用redis消息队列

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

安装redis 和 php-redis扩展,参考网友博文

linux环境   https://blog.csdn.net/cailongbiaoyuli/article/details/83445906

windows环境  https://blog.csdn.net/q810391679/article/details/80812578

 

通过生产消费模式实现异步处理 ,把待运行任务添加到消息队列, 定时从队列取出消息处理任务;

定时处理任务的方法,

linux环境下,添加到corntab,每1分钟运行一次

# crontab -e

*/1 * * * * /usr/local/bin/php /home/www/app.php?do=worker

windows环境下,添加到计划任务,计划任务运行bat文件,bat中调用php执行脚本

tmp.bat

D:\php56\php.exe -q E:\www\201906\app.php?do=worker

 

 

<?php
// 发布消息
// app.php?do=rpush&act=sendsms&mob=15530000000&msg=tmp_order_new
// 定时任务 消费消息
// app.php?do=worker
$conf = ['redis_host'=>'127.0.0.1', 'redis_port'=>6379, 'redis_auth'=>'6min']
$app = new appStd($conf);
$app->run();

class appStd
{
    private static $redis;
    
    public function __construct($conf){
        if(! (static::$redis instanceof Redis)) {
            self::$redis = new Redis();
            self::$redis->connect($conf['redis_host'], $conf['redis_port']);
            if(isset($conf['reids_authpass'])){
                self::$redis->auth($conf['redis_auth']);
            }
        }
    }

    public function worker($param){
        //ignore_user_abort(true);
        set_time_limit(30);
        while (true) {
            try{
                $cmd = self::$redis->get('cmd');
                if('stop' == $cmd) break;
                //取出一条消息
                $msg = self::$redis->lPop('msglist');
                if(!$msg) break;
                $wk = unserialize($msg);
                switch($wk['act']){
                    case 'sendsms':
                        $do = SMS::send($wk['data']);
                        break;
                    case 'report':
                        $do = YUN::report($wk['data']);
                        break;
                }
                //失败任务放回队列
                if(!$do){
                    self::$redis->rPush('msglist', $msg);
                }
            }catch(Exception $e){
                die($e->getMessage());
            }
        }
        die('success');
    }

    public function rpush($param){
        $msg = ['act'=>$param['act'], 'data'=>[]];
        self::$redis->rPush('msglist', serialize($msg));
        die('success');
    }
    
    public function run(){
        $param  = &$_REQUEST;
        $action = isset($param['do']) ? $param['do'] : '';
        if( !method_exists($this, $action)){
            $this->fail('disabled action');
        }
        $this->$action($param);
    }
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php中的session使用详解发布时间:2022-07-10
下一篇:
laravel5.5运行在php7.0报错Symfony\Component\Translation\Translator.phpFatalThrow ...发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap