이 글은 주로 PHP에서 전자상거래 주문의 Redis 대기열을 자동으로 확인하는 방법을 소개합니다. 관심 있는 친구들이 참고하시면 도움이 될 것입니다.
1. 시나리오
이전에 구축한 전자상거래 플랫폼에서는 상품을 받은 후 결제할 때 대부분의 사용자가 주도적으로 영수증을 확인하지 않았습니다. 가맹점에서 다양한 불만사항이 있어서 요청에 따라 주문을 했고 배송 후 x일 뒤에 자동으로 영수증이 확인되었습니다. 소위 주문 수신 자동 확인은 주문 상태를 변경하기 위해 특정 시간에 업데이트 명령문을 실행하는 것을 의미합니다.
2. 아이디어
가장 번거로운 방법은 Linux 백그라운드 예약 작업을 통해 적격 주문을 쿼리한 후 업데이트하는 것입니다. 이상적으로는 매분 업데이트해야 하는 주문이 있는 경우 이 접근 방식이 효과적입니다. 그러나 플랫폼이 너무 작고 판매자의 배송 시간 대부분이 집약적이어서 24시간 동안 매분 흩어지지 않습니다. 그러면 예약된 작업의 경우 쿼리가 너무 많아 적합하지 않습니다. 여기서는 자동으로 영수증을 확인할 수 있는 주문 정보를 redis, memcache, Rabbitmq 등 다른 미디어에 먼저 저장한 뒤 스크립트를 실행해 이전 미디어에서 주문 정보를 얻어 판단할 수 있다. 데이터베이스에 대한 압박.
Redis Queue Producer
이와 관련하여 매일 오전 2시에 Linux 예약 작업을 통해 입고 확인될 주문 정보를 쿼리하여 redis에 저장하도록 선택합니다. , redis 우리가 선택한 queue에서는 선입선출(first in, first out)이 특징입니다. 주문을 조회할 때 이전 데이터는 배송 시간별로 정렬되므로 대기열에서 가장 먼저 나오는 주문은 지정된 자동 주문에 가장 가까운 주문이어야 합니다. 수령 시간. 코드는 다음과 같습니다
$successCount=0; $failCount=0; $screen_time = 3600*24*9;//设置筛选天数 $data = array(); $now_time = time(); //查询符合要求的数据 $sql="select id,send_time as deliver_time from `order` where is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time>0 and send_time + {$screen_time} < $now_time order by send_time asc"; $res = $con->query($sql); //当队列还有数据时将数据记录并清除 while($redis->LLEN('auto_recevice_order')){ $txt = '执行时间:'.date('Y-m-d H:i:s').',信息:'.$redis->RPOP('auto_recevice_order'); file_put_contents('./autoToken/fail_log.txt',$txt."\r\n".PHP_EOL,FILE_APPEND); $failCount++; } //重新填充数据进队列 while ($row = $res->fetch_assoc()) { $successCount++; $redis->LPUSH('auto_recevice_order',json_encode($row1)); } $con->close(); $success=date('Y-m-d H:i:s').':[推送成功]:本次成功推送数据:'.$successCount.'条;记录上次处理失败数据:'.$failCount."条\r\n"; file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);
Redis 대기열 소비자
Linux 예약 작업을 통해 대기열 소비자가 수행되지 않습니다. PHP 스크립트를 실행하려면 Linux의 screen+php cli 모드를 사용하세요. 소비자는 계속하기만 하면 됩니다. 대기열에서 주문 정보를 읽은 다음 주문 정보에서 배송 시간을 결정합니다. 자동 수신 요구 사항이 충족되면 업데이트 문이 실행됩니다. 동시에 배달 시간에 도달하지 않았고 배달 시간과 배달 시간 사이의 간격이 상대적으로 큰 경우 PHP 스크립트를 특정 횟수 동안 절전 모드로 설정할 수 있습니다. 시간 요구 사항을 충족하지 못한 획득 주문은 재설정해야 하며, 이는 또한 대기열의 맨 위에 있습니다. 다음에 받을 수 있도록 말이죠. 코드는 다음과 같습니다.
$set_time = 3600*24*10;//设置几天后自动收货 while(true){ if($i%30==0){ usleep(10);//防止while 循环使CPU使用率过高 } if($redis->LLEN('auto_recevice_order')){ $data = json_decode($redis->RPOP('auto_recevice_order')); $id = (int)$data->id;//将数据转化为整形 $deliver_time = (int)$data->deliver_time;//将数据转化为整形 $res1 = $res2 =false; $now_time = time(); if(($deliver_time+$set_time)<$now_time){ $sql1 = "update `order` set `is_token`='1',`token_time` = $now_time where id=$id and is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time + {$set_time} < $now_time"; $res1 = $con->query($sql1);//更新数据 $rows = mysqli_affected_rows($con); if($rows){ $ip = $this->getIp(); $sql2 = "insert into `order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`) VALUES($id,'系统自动收货','$ip','系统','服务器','收货',$now_time)";//写入订单日志 $res2 = $con->query($sql2);//添加日志数据 } } if($res1==false){//将没达到条件的数据重新插入队列中 $redis->RPUSH('auto_recevice_order',json_encode(array('id'=>$id,'deliver_time'=>$deliver_time))); } } $i++; }
여기서 php 스크립트를 실행하려면 리눅스 화면이나 슈퍼바이저 또는 nohup 데몬을 사용해야 합니다. 특정 사용법은 Baidu를 참조할 수 있습니다. 동일한 스크립트에 필요한 로그 기록을 두는 것이 가장 좋습니다.
3. Thinking
비즈니스가 성장함에 따라 동일한 순간에 대기열에서 처리해야 하는 여러 주문이 있으며, 한 번에 하나의 관련 주문 정보만 대기열에서 꺼낼 수 있습니다. , 하나의 생산자와 여러 소비자가 있는 모델을 사용할 수 있습니다. 이 경우 메시지가 하나의 소비자에게만 도달할 수 있도록 잠금 메커니즘을 사용할 수 있습니다. Redis 데이터가 일정량에 도달하면 생산자의 실행 빈도와 해당 조건을 적절하게 조정할 수 있습니다.
Redis Queue에서 전자상거래 주문 접수 자동 확인을 구현하는 PHP의 위 기사는 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. 또한 Script Home을 지원해 주시길 바랍니다.
자동으로 전자상거래 웹사이트 영수증 확인이를 달성하는 방법
PHP 방법 redis에 존재하지 않는 6자리 난수를 얻는 방법
PHP 구현 redis메시지 대기열을 통해 Weibo를 게시하는 방법
위 내용은 전자상거래 주문 접수 Redis 대기열의 자동 확인을 구현하는 PHP 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!