この記事では、PHP で e-commerce 注文の Redis キューを自動的に確認する方法を主に紹介します。興味のある方はぜひ参考にしてください。
1. シナリオ
以前に構築した電子商取引プラットフォームでは、ほとんどのユーザーは商品を受け取った後、支払い時に受け取りを確認するために自らクリックすることはありませんでした。販売者、販売者からさまざまな苦情があったため、要求に基づいて注文し、発送から x 日後に自動的に受領確認を行いました。いわゆる注文の受領の自動確認とは、特定の時間に更新ステートメントを実行して注文のステータスを変更することを意味します。
2. アイデア
最も面倒な方法は、Linux バックグラウンドでスケジュールされたタスクを通じて条件付きの注文をクエリし、更新することです。理想的には、このアプローチは、毎分更新する必要がある注文がある場合に機能します。ただし、プラットフォームが小さすぎるため、販売者の配送時間のほとんどは集中しており、24 時間のうち 1 分ごとに分散されることはありません。次に、スケジュールされたタスクの場合、クエリが多すぎて適していません。ここで、自動的に受領確認を行うための注文情報をredis、memcache、rabbitmqなどの他の媒体に保存しておき、スクリプトを実行して前の媒体から注文情報を取得して判定することでクエリを大幅に削減できます。データベースに対するプレッシャー。
Redisキュープロデューサー
この点に関して、毎日午前2時にLinuxのスケジュールされたタスクを通じて、受け取りが確認される予定の注文情報をクエリし、それをredisに保存することを選択します。 、redis 選択したキューでは、キュー処理の特性が先入れ先出しです。注文をクエリするとき、以前のデータは配達時間によって並べ替えられるため、キューからの最初の注文は、指定された自動順序に最も近い順序である必要があります。受け取り時間。コードは次のとおりです
$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 スクリプトを一定の回数スリープさせることができます。この時間数は次のように調整できます。取得した時間要件を満たさない注文は、redis キューにプッシュする必要があり、キューの先頭にもなります。次回も手に入るように。コードは次のとおりです:
$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. 考え方
ビジネスが成長するにつれて、キュー内で同時に処理する必要がある複数の注文があり、一度にキューから取り出せる関連する注文情報は 1 つだけです。 、1 つのプロデューサーと複数のコンシューマーを持つモデルを使用できます。この場合、ロック メカニズムを使用して、メッセージが 1 つのコンシューマーのみに到達できるようにすることができます。 Redis データが一定量に達すると、プロデューサーの実行頻度とそれに応じた条件を適切に調整できます。
Redisキューで電子商取引の配送の自動確認を実現するPHPの上記記事は、編集者が共有した内容ですので、皆様の参考になれば幸いです。また、皆さんもScript Homeを応援していただければ幸いです。
電子商取引ウェブサイトを自動的に領収書を確認するそれを実現する方法
PHP実装 redisメッセージキュー経由でWeiboを公開する方法
以上がEC注文受付Redisキューの自動確認を実現するPHP手法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。