Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung der Redis-Warteschlange durch PHP zur automatischen Bestätigung des Eingangs von E-Commerce-Bestellungen

Detaillierte Erläuterung der Verwendung der Redis-Warteschlange durch PHP zur automatischen Bestätigung des Eingangs von E-Commerce-Bestellungen

*文
*文Original
2018-01-03 11:54:422149Durchsuche

Wie realisiert PHP die automatische Empfangsbestätigung von E-Commerce-Bestellungen? Heute vermittelt Ihnen der Editor Kenntnisse darüber, wie PHP die Redis-Warteschlange verwendet, um den Eingang von E-Commerce-Bestellungen automatisch zu bestätigen. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen. Ich hoffe, es wird für alle hilfreich sein.

1. Szenario

Auf der E-Commerce-Plattform, die wir zuvor erstellt haben, klickten die meisten Benutzer nach Erhalt der Ware nicht aktiv zur Bestätigung Der Erhalt der Ware führte bei den Händlern zu diversen Beschwerden bei der Bezahlung, so dass auf Nachfrage eine automatische Bestätigung des Erhalts x Tage nach Lieferung veranlasst wurde. Bei der sogenannten automatischen Empfangsbestätigung von Bestellungen handelt es sich um die Ausführung einer Update-Anweisung zu einem bestimmten Zeitpunkt, um den Status der Bestellung zu ändern.

2. Ideen

Die umständlichste Methode besteht darin, qualifizierte Bestellungen über geplante Linux-Hintergrundaufgaben abzufragen und dann zu aktualisieren. Idealerweise funktioniert dieser Ansatz, wenn Bestellungen jede Minute aktualisiert werden müssen. Allerdings ist die Plattform zu klein und die Lieferzeit des Verkäufers ist größtenteils intensiv und wird nicht auf jede Minute der 24 Stunden verteilt. Dann gibt es für geplante Aufgaben zu viele Abfragen und es ist nicht geeignet. Hier können Sie zunächst die Bestellinformationen, die den Empfang automatisch bestätigen, in anderen Medien wie Redis, Memcache, Rabbitmq speichern und dann das Skript ausführen, um die Bestellinformationen zur Beurteilung von den vorherigen Medien abzurufen. Dies kann die Abfrage erheblich reduzieren Druck auf die Datenbank.

Produzent der Redis-Warteschlange

In diesem Zusammenhang entscheiden wir uns dafür, jeden Tag um zwei Uhr morgens geplante Linux-Aufgaben zu verwenden Zur Bestätigung des Empfangs werden die Bestellinformationen abgefragt und dann in Redis gespeichert. Bei der Abfrage der Bestellung werden die vorherigen Daten nach der Lieferzeit sortiert Die erste Bestellung, die aus der Warteschlange entfernt wird, muss die Bestellung sein, die der angegebenen automatischen Empfangszeit am nächsten liegt. Der Code lautet wie folgt

$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-Warteschlangenverbraucher

Der Warteschlangenverbraucher erfolgt nicht über geplante Linux-Aufgaben, sondern über Linux-Bildschirm+php Der CLI-Modus führt das PHP-Skript aus. Der Verbraucher muss lediglich die Bestellinformationen kontinuierlich aus der Warteschlange lesen und dann die Lieferzeit in den Bestellinformationen ermitteln. Wenn die Anforderungen für den automatischen Empfang erfüllt sind, wird die Aktualisierungsanweisung ausgeführt. Wenn die Lieferzeit noch nicht erreicht ist und die Lücke zwischen der Lieferzeit und der Lieferzeit relativ groß ist, können Sie das PHP-Skript gleichzeitig für eine bestimmte Anzahl von Malen in den Ruhezustand versetzen. Diese Zeitspanne kann angepasst werden Die erhaltenen Aufträge, die die Zeitanforderungen nicht erfüllen, müssen in die Redis-Warteschlange verschoben werden, und sie befinden sich ebenfalls an der Spitze der Warteschlange. Damit Sie es beim nächsten Mal bekommen. Der Code lautet wie folgt:

$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++;
}

Um das PHP-Skript hier auszuführen, müssen Sie den Linux-Bildschirm oder den Supervisor oder den Nohup-Daemon verwenden. Für spezifische Verwendungszwecke können Sie sich an Baidu wenden. Es ist am besten, die erforderlichen Protokolldatensätze im selben Skript zu haben.

3. Denken

Mit dem Wachstum des Geschäfts gibt es mehrere Warteschlangen, die in derselben Sekunde bearbeitet werden müssen. Bestellungen, und wenn jeweils nur eine relevante Bestellinformation aus der Warteschlange entnommen werden kann, kann das Modell eines Produzenten und mehrerer Verbraucher übernommen werden. In diesem Fall kann ein Sperrmechanismus verwendet werden, um sicherzustellen, dass eine Nachricht nur erreicht werden kann ein Verbraucher. Wenn die Redis-Daten eine bestimmte Menge erreichen, können die Ausführungshäufigkeit des Herstellers und die entsprechenden Bedingungen entsprechend angepasst werden.

Verwandte Empfehlungen:

Detaillierte Erklärung, wie PHP7 MongoDB-Fuzzy-Abfragen implementiert

Detaillierte Erklärung, wie PHP eine einfache automatische Suchfeld-Eingabeaufforderungsfunktion implementiert

$argv- und $argc-Konfigurationsmethoden in PHP-Skripten

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Redis-Warteschlange durch PHP zur automatischen Bestätigung des Eingangs von E-Commerce-Bestellungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn