>  기사  >  백엔드 개발  >  PHP로 상품 자동 수령을 달성하는 방법

PHP로 상품 자동 수령을 달성하는 방법

藏色散人
藏色散人원래의
2021-09-10 10:18:441818검색

PHP에서 상품 자동 수령을 구현하는 방법: 1. Linux 예약 작업을 통해 배송을 확인할 주문 정보를 쿼리합니다. 2. Redis에 주문 정보를 저장합니다. 3. 해당 스크립트를 실행합니다.

PHP로 상품 자동 수령을 달성하는 방법

이 기사의 운영 환경: linux5.9.8 시스템, PHP7.1 버전, DELL G3 컴퓨터

PHP로 상품 자동 수령을 달성하는 방법은 무엇입니까?

PHP는 전자상거래 주문 접수 자동 확인을 실현합니다. redis queue

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(&#39;auto_recevice_order&#39;)){
$txt = &#39;执行时间:&#39;.date(&#39;Y-m-d H:i:s&#39;).&#39;,信息:&#39;.$redis->RPOP(&#39;auto_recevice_order&#39;);
file_put_contents(&#39;./autoToken/fail_log.txt&#39;,$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充数据进队列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH(&#39;auto_recevice_order&#39;,json_encode($row1));
}
 $con->close();
 $success=date(&#39;Y-m-d H:i:s&#39;).&#39;:[推送成功]:本次成功推送数据:&#39;.$successCount.&#39;条;记录上次处理失败数据:&#39;.$failCount."条\r\n";
 file_put_contents(&#39;./success_log.txt&#39;,$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(&#39;auto_recevice_order&#39;)){
$data = json_decode($redis->RPOP(&#39;auto_recevice_order&#39;));
$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`=&#39;1&#39;,`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,&#39;系统自动收货&#39;,&#39;$ip&#39;,&#39;系统&#39;,&#39;服务器&#39;,&#39;收货&#39;,$now_time)";//写入订单日志
 $res2 = $con->query($sql2);//添加日志数据
 }
 }
 if($res1==false){//将没达到条件的数据重新插入队列中
  $redis->RPUSH(&#39;auto_recevice_order&#39;,json_encode(array(&#39;id&#39;=>$id,&#39;deliver_time&#39;=>$deliver_time)));
 }
}
 $i++;
}

여기에서 php 스크립트를 실행하려면 Linux 화면이나 감독자 또는 nohup 데몬을 사용해야 합니다. 구체적인 사용법은 Baidu에서 찾을 수 있습니다. 동일한 스크립트에 필요한 로그 기록을 두는 것이 가장 좋습니다.

3. Thinking

비즈니스가 성장함에 따라 동일한 순간에 대기열에서 처리해야 하는 여러 주문이 있으며, 한 번에 하나의 관련 주문 정보만 대기열에서 꺼낼 수 있습니다. , 하나의 생산자와 여러 소비자가 있는 모델을 사용할 수 있습니다. 이 경우 메시지가 하나의 소비자에게만 도달할 수 있도록 잠금 메커니즘을 사용할 수 있습니다. Redis 데이터가 일정량에 도달하면 생산자의 실행 빈도와 해당 조건을 적절하게 조정할 수 있습니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP로 상품 자동 수령을 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.