ホームページ  >  記事  >  バックエンド開発  >  Redisキューを利用してEC注文の自動受付確認を実現するPHPの詳細解説

Redisキューを利用してEC注文の自動受付確認を実現するPHPの詳細解説

*文
*文オリジナル
2018-01-03 11:54:422199ブラウズ

PHP を使用して e コマース注文の受信を自動的に確認するにはどうすればよいですか?今日は、編集者が Redis キューを使用して電子商取引の注文の受信を自動的に確認する PHP の知識を紹介します。編集者はこれが非常に良いものだと思ったので、皆さんの参考として今から共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

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(&#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 スクリプトを一定の回数スリープさせることができます。この時間数は次のように調整できます。取得した時間要件を満たさない注文は、redis キューにプッシュする必要があり、キューの先頭にもなります。次回も手に入るように。コードは次のとおりです:

$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. 考え方

ビジネスが成長するにつれて、キュー内で同時に処理する必要がある複数の注文があり、一度にキューから取り出せる関連する注文情報が 1 つだけになる場合この場合、ロック メカニズムを使用して、メッセージが 1 つのコンシューマにのみ到達できるようにすることができます。 Redis データが一定量に達すると、プロデューサーの実行頻度とそれに応じた条件を適切に調整できます。

関連する推奨事項:

php7 で MongoDB ファジークエリを実装する方法の詳細な説明

PHP で単純な検索ボックスの自動プロンプト機能を実装する方法の詳細な説明

PHPスクリプトのargc設定方法の$argvと$

以上がRedisキューを利用してEC注文の自動受付確認を実現するPHPの詳細解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。