php利用workerman的定时器实现延时操作(订单支付不成功后一定时间未支付自动取消订单)

延时操作个人目前接触最多的场景是用户下单后一定时间未支付自动取消订单,传统的做法是采用定时任务定时扫描数据库超时订单或者利用客户端的请求每次请求去检测一次是否有超时订单,这些方法我始终感觉不是很好,所以一直想办法在弄一个比较理想的方法,至少比上面这两个方法好一点的处理方式

今天没事就研究了一下这个东西,主要是利用workerman的定时器。所以首先得下载workerman然后引入到自己的项目,或者composer安装也可以,具体就不再多说了。先贴出代码


use Workerman\Worker;
use \Workerman\Lib\Timer;
require_once './Workerman/Autoloader.php';
//创建一个Worker监听2345端口,使用http协议通讯
$http_worker = new Worker(" 
//启动4个进程对外提供服务
$http_worker->count = 4;
//检查订单是否超时
function check_order($order){
    //这个方法用于检查该订单是否超时。。。。具体逻辑根据实际应用场景写,这里只记录是否进入这个方法
    file_put_contents('./log.txt','订单编号:'.$order.' 处理时间:'.date('Y-m-d H:i:s')."\n",FILE_APPEND);
}
$http_worker->onMessage = function($connection, $data)
{
    $msg='';
    if(isset($data['get']['order'])){
        $msg=json_encode($data['get']);
        //10秒后执行检查订单方法,最后一个参数传递false,表示只运行一次
        //这里记录请求时间用于对比延时操作的效果
        file_put_contents('./log.txt','订单编号:'.$data['get']['order'].' 请求时间:'.date('Y-m-d H:i:s')."\n",FILE_APPEND);
        Timer::add(10, 'check_order', array($data['get']['order']), false);
    }
    $connection->send('请求成功:'.$msg);
};
//运行worker
Worker::runAll();

新建一个php文件,假设命名为index.php,将上面代码复制到该文件,注意里面require_once的路径根据自己目录做调整,然后打开cmd窗口,进入到index.php所在目录,执行命令:php index.php,正常应该会看到的结果应该是这样

php利用workerman的定时器实现延时操作(订单支付不成功后一定时间未支付自动取消订单)_第1张图片

如果报错需要去看看workerman的文档,这时不要关闭该cmd窗口。这时我们浏览器去访问:http://127.0.0.1:2345/?order=No1

和http://127.0.0.1:2345/?order=No2,然后查看log.txt的记录

php利用workerman的定时器实现延时操作(订单支付不成功后一定时间未支付自动取消订单)_第2张图片

最终结果不错,达到了我预期的效果。

 

 

你可能感兴趣的:(php,thinkphp5,tp6)