自動受け取りを実現する
php メソッド: 1. Linux のスケジュールされたタスクを通じて、受け取りが確認される注文情報をクエリします; 2. 注文情報を redis に保存します; 3. 対応するスクリプトを実行します。
この記事の動作環境:linux5.9.8システム、PHP7.1バージョン、DELL G3コンピュータ
実現方法phpで商品を自動受け取り?
#PHP は、e コマース注文の受信の自動確認 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 のスケジュールされたタスクを通じて実行されませんが、 Linux 画面 php cli モードは php スクリプトを実行します 消費者はキューから注文情報を継続的に読み取り、注文情報の配送時間を決定するだけで済みます 自動受け取りの要件が満たされている場合、更新ステートメントが実行されます。同時に、配信時間に達しておらず、配信時間との差が比較的大きい場合は、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 データが一定量に達すると、プロデューサーの実行頻度とそれに応じた条件を適切に調整できます。推奨学習: 「PHP ビデオ チュートリアル
」###以上がphpで商品の自動受け取りを実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。