队列的使用php,使用PHP+Redis实现任务队列

81443b7c5054bc9bc7466f7d3d4582a2.png// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法

$uuid = uniqid();

$tsk_name = "mytask";

$time_out = 30000; // 超时策略: 30秒

$time_start = time();

$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)

while($uuid != $redis->lGet($tsk_name, 0)){

if((time()-$time_start)> $time_out) {

break; // 超时跳出(某些原因队列异常了, 可能永远取不到)

}

usleep(10); // sleep 10ms, 再次尝试

}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容

// 处理完成后(数据库等已入库更新), 需要:

if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求

$redis->lPop($tsk_name); // 完成任务了, 从队列中移除

}else{

// 出现这种情况, 是因为超时了, 或前面的$uuid没有被消费

// 若不清除, 后续的请求, 都将无法正常进入队列执行

// 取队列中的所有$uuid

$queues = $redis->lRange($tsk_name, 0, -1);

foreach($queues as $i=>$uid){

if($uid==$uuid){

// 队列中仍存在当前的$uuid

// 清除$uuid以前异常的队列, 让后边的请求得以正常排队

$redis->lTrim($tsk_name, $i+1, -1);

break;

}

}

}

// 响应内容

return $response;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值