PHP中怎样通过Red实现执行订单支付的定时任务
Admin 2022-09-22 群英技术资讯 772 次浏览
这篇文章给大家分享的是“PHP中怎样通过Red实现执行订单支付的定时任务”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。<?php
namespace Utils;
use Phalcon\Config\Adapter\Ini as ConfigIni;
class Redis{
private static $redis1;
private static $session;
/**
* 获取一个单例的redis对象
* @param string $name
* @return \Redis
*/
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->connect($config[$name]['host'], $config[$name]['port'],2);
if(isset($config[$name]['password']) && !empty($config[$name]['password'])){
self::$$name->auth($config[$name]['password']);
}
self::$$name->select($config[$name]['database']);
}catch (\Exception $exception){
self::$$name = false;
}
return self::$$name;
}
};
/**
* 订单任务
*/
public function orderAction()
{
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'=>['order_sn'=>$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->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->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->hSet('order_domain_retry', 'domain_retry_' . $order_info['id'], json_encode($order_info));
}
//队列第一个 =>出列 $Redis->lPop($key); //入到 =>队列最后 $Redis->rPush($key); //队列最后一个 =>出列 $Redis->rPop($key); //入到 =>队列第一个 $Redis->rPop($key); //返回整个列表的值,不出列 $redis->lRange($key,0,-1);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
laravel安装验证码包的方法:1、登录网址packagist.org;2、查找laravel captcha,找到“mews/captcha”;3、根据packagist上的使用方法实现验证码的安装即可。
文本主要给大家分享的是关于php依赖注入容器的内容,对于新手来说依赖注入容器可能比较难理解,文本有对依赖注入容器理解以及具体代码,有这方面学习需要的朋友可以参考参考。下面我们一起来了解一下。
php7安装intl扩展的方法:1、下载icu源码包;2、解压icu及编译安装;3、下载并解压php包;4、进入php解压包目录下,编译安装;5、配置文件及启动文件即可。
今天小编就为大家分享一篇关于PHP正则验证字符串是否为数字的两种方法并附常用正则,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
php尾部逗号的使用:1、在参数、元素、变量列表结尾,追加尾部逗号。2、这个特性已经允许在数组内使用,并且从PHP7.2开始,分组命名空间语法也开始支持尾部逗号。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008