PHP를 사용하여 전자상거래 주문 접수를 자동으로 확인하는 방법은 무엇입니까? 오늘 편집자는 전자 상거래 주문 접수를 자동으로 확인하기 위해 Redis 대기열을 사용하여 PHP에 대한 지식을 제공할 것입니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리도록 하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.
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 예약 작업을 통해 수행되지 않습니다. Linux의 screen+php cli 모드를 사용하면 소비자가 지속적으로 PHP 스크립트를 실행하면 됩니다. 대기열에서 읽어온 후 주문 정보에서 배송 시간을 결정합니다. 자동 수신 요구 사항이 충족되면 업데이트 문을 실행합니다. 동시에 배달 시간에 도달하지 않았고 배달 시간과 배달 시간 사이의 간격이 상대적으로 큰 경우 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 스크립트를 실행하려면 Linux 화면이나 감독자 또는 nohup 데몬을 사용해야 합니다. 구체적인 사용법은 Baidu에서 찾을 수 있습니다. 동일한 스크립트에 필요한 로그 기록을 두는 것이 가장 좋습니다.
3. 생각하기
비즈니스가 성장함에 따라 동일한 순간에 대기열에서 처리해야 하는 여러 주문이 있으며, 한 번에 하나의 관련 주문 정보만 대기열에서 꺼낼 수 있습니다. 이때는 하나의 생산자와 여러 소비자의 모델을 채택할 수 있습니다. 이 경우 메시지가 하나의 소비자에게만 도달할 수 있도록 잠금 메커니즘을 사용할 수 있습니다. Redis 데이터가 일정량에 도달하면 생산자의 실행 빈도와 해당 조건을 적절하게 조정할 수 있습니다.
관련 권장 사항:
php7에서 MongoDB 퍼지 쿼리를 구현하는 방법에 대한 자세한 설명
PHP에서 간단한 검색 상자 자동 프롬프트 기능을 구현하는 방법에 대한 자세한 설명
위 내용은 전자상거래 주문 접수 자동 확인을 실현하기 위해 Redis 대기열을 사용하는 PHP에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!