前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP使用Redis队列执行定时任务实例讲解

PHP使用Redis队列执行定时任务实例讲解

作者头像
用户8832503
修改2021-07-14 10:51:50
5430
修改2021-07-14 10:51:50
举报
文章被收录于专栏:php编辑php编辑

Redis类:

<?php

namespace Utils;

use PhalconConfigAdapterIni as ConfigIni;

class Redis{

private static $redis1;

private static $session;

/**

public static function getObj($name='redis1')

{

try{

if(!empty(self::$$name)){

return self::$$name;

}

$config = new ConfigIni(APP_PATH."/config".ENV."/redis.ini");

self::$$name = new Redis();

self::$$name-&gt;connect($config$name]['host'], $config[$name,2);

if(isset($config[$name]['password']) && !empty($config[$name]['password'])){

self::$$name-&gt;auth($config$name);

}

self::$$name-&gt;select($config$name);

}catch (Exception $exception){

self::$$name = false;

}

return self::$$name;

}

};

定时任务:

/**

public function order/

/Action()

{

error_reporting(E_ALL & ~E_NOTICE);

$redis = Redis::getObj();

//获取数据库连接实例

$db = $this->getDI()->getShared('db');

while (true) {

print_r(' -start- ');

$order_status = 1;

file_put_contents(APP_PATH . "/../domain_order.log", time());

try {

//防止长时间无任务导致MySQL超时

$db->query("select 1");

//出列

$order_info = $redis->lPop('order');

if (!$order_info) {//队列为空时暂停

echo ' -empty- ';

sleep(1);

continue;

}

$order_info = json_decode($order_info, true);

$model_order_info = NetUserOrder::findFirst(['order_sn = :order_sn:','bind'=&gt;['order_sn'=&gt;$order_domain_info_save->order_sn]]);

//未支付

if($model_order_info->pay_status != 200){

echo 'no pay';

continue;

}

//已操作

if ($order_domain_info_save->order_status == 3) {

echo ' -Operated- ';

continue;

}

//事务开始

$db->begin();

##

这里执行订单流/

/程操作

##

$order_status = 3;//操作成功

//修改订单状态

$order_domain_info_save-&gt;order_status = $order_status;

$order_domain_info_save->operation_time = time();

$order_domain_info_save->update();

}

//提交事务

$db->commit();

printf('### succ order_id' . $order_info['id'] . ' ###');

} catch (Exception $e) {

//回滚事务

$db->rollback();

$order_status = 2;//操作失败

$order_domain_info_save-&gt;order_status = $order_status;

$order_domain_info_save->operation_time = time();

$order_domain_info_save->update();

printf(' error ' . $e->getMessage() . ' ');

//异常,发送通知

Log::error($e->getMessage());

$redis-&gt;hSet('order_domain_retry', 'domain_retry_' . $order_info['id'], json_encode($order_info));

}

Redis常用队列方法:

//队列第一个 =>出列

$Redis-&gt;lPop($key);

//入到 =>队列最后

$Redis-&gt;rPush($key);

//队列最后一个 =>出列

$Redis-&gt;rPop($key);

//入到 =>队列第一个

$Redis-&gt;rPop($key);

//返回整个列表的值,不出列

$redis-&gt;lRange($key,0,-1);

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档