Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der verzögerten Bearbeitung von Bestellungen in PHP

Ausführliche Erläuterung der verzögerten Bearbeitung von Bestellungen in PHP

小云云
小云云Original
2018-01-01 10:40:421260Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Verwendung von PHP zur Implementierung der verzögerten Verarbeitung von Bestellungen vor. Der Artikel stellt es ausführlich anhand von Beispielcode vor. Es hat einen gewissen Referenz-Lernwert für alle, die es brauchen Es kann folgen. Lernen wir gemeinsam mit dem Herausgeber.

Geschäftsanforderungen

Bestellungen sind eine Funktion, auf die wir in der täglichen Entwicklung häufig stoßen. In letzter Zeit müssen wir bei der Geschäftsabwicklung eine automatische Stornierung implementieren, nachdem der Kunde die Bestellung aufgegeben hat Zeitüberschreitung und nicht bezahlt prüft, ob die Bestellung storniert werden muss, und verarbeitet sie dann in Stapeln

  • Erstellen Sie nach der Bestellung einen Timer und verzögern Sie die Verarbeitung

  • Verwenden Sie Redis- oder Memcache-Speicher, legen Sie die Ablaufzeit fest und löschen Sie automatisch

  • Unter Berücksichtigung der oben genannten Methoden wird die erste Methode zuerst eliminiert, denn wenn der Kunde den APP-Hintergrund oder die Netzwerkverbindung deaktiviert, dann Die Anfrage kann nicht an den Server gesendet werden und die Bestellung bleibt in einem unverarbeiteten Zustand. Die zweite Methode wird häufiger verwendet, es gibt jedoch Genauigkeitsprobleme und die Notwendigkeit, den Zeitraum der geplanten Aufgabe zu bestätigen, sodass sie vorübergehend ist Als Sicherungsmethode aufgeführt, besteht das Problem bei der vierten Methode darin, dass die Bestellung physisch gelöscht wird. Nicht verarbeitete Daten können nicht gezählt werden (natürlich können Sie sie zur Langzeitspeicherung in einer Datenbank wie MySQL speichern). Speichern Sie Redis und verwenden Sie dann Methode 2 für die reguläre Verarbeitung.

  • Bereiten Sie sich schließlich auf die Verwendung von Methode drei vor.

  • Wenn Sie die Verwendung von Methode 3 bestätigen, müssen Sie aufgrund der verwendeten Entwicklungssprache PHP Swoole oder Workerman verwenden, um die Timer-Funktion zu implementieren. Da Swoole ein in C entwickeltes Erweiterungsframework ist, ist es in Bezug auf die Leistung definitiv besser, daher habe ich mich für Swoole entschieden.

Vorbereitung


Um Swoole zu verwenden, müssen Sie zunächst die Swoole-Erweiterung auf dem Server installieren. Die Installationsmethode ähnelt der Installation anderer Erweiterungen siehe diesen Artikel


Überprüfen Sie nach der Installation, ob die Erweiterung normal installiert ist, überprüfen Sie phpinfo oder PHP-m, wenn Swoole erscheint, bedeutet dies, dass die Installation erfolgreich war

  • Die offizielle Dokumentation von Swoole ist verfügbar. Timerbezogene Dokumente

  • Testen starten

  • Wir erstellen eine swoole_test.php-Datei und eine log.txt-Datei (zum Testen), swoole_test.php Der Code lautet wie folgt:

  • Greifen Sie dann auf diese PHP-Datei auf der Webseite zu. Das Ergebnis lautet wie folgt:


Dann ausführen PHP im Linux-Terminal: /usr/local/php7/bin/php / home/app/swoole_test.php, die Ergebnisse sind wie folgt:

<?php
swoole_timer_after(3000, function () {
 append_log(time());
 echo "after 3000ms.\n";
});
function append_log($str) {
 $dir = &#39;log.txt&#39;;
 $fh = fopen($dir, "a");
 fwrite($fh, $str."\n");
 fclose($fh);
}

Ich fühlte mich ein wenig nervös. . .

Es stellt sich heraus, dass der Timer nur im CLI-Modus verwendet werden kann, also wird diese Idee wahrscheinlich GG sein. Gibt es keine andere Möglichkeit? Gerade als ich ohne Tränen weinen wollte, kam mir plötzlich eine Idee und ein Wort schoss mir in den Sinn: Python!

Ja, wir können uns nicht nur auf PHP verlassen, es gibt auch eine magische Sprache wie Python. Wir wissen, dass die os.system-Methode im Python-OS-Modul die Befehlszeile ausführen kann, also nicht Sie führen die Datei swoole_test.php gerade im CLI-Modus aus?

Nachdem ich aufgeregt war, fragte ich mich, ob der Test machbar war


Wir wissen, dass Linux alle mit Python geliefert wird, aber verschiedene Versionen haben unterschiedliche Python-Versionen, und einige kommen mit Es ist Python2.6. Die Version ist zu niedrig, daher müssen Sie eine höhere Version installieren. Hier wähle ich Python3 und achte darauf, die mit dem System gelieferte Version nicht zu überschreiben. Im Folgenden sind die groben Installationsschritte aufgeführt:


wget http://python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz


tar xf Python-3.6.0.tar.xz

  • cd Python-3.6.0

  • . / configure --prefix=/usr/local/python3

  • make && make install

  • ln -s /usr/local/python3/ bin /python3 /usr/bin/python3

  • Geben Sie als Nächstes Folgendes ein: Python3 im Terminal. Wenn

  • erscheint , die Installation ist erfolgreich.

Nach der Installation von Python3 erstellen wir eine neue test.py-Datei mit folgendem Inhalt:


Dann führen wir sie im Terminal aus: /usr/bin/python3 / home/app /test.py, Hinweis: Dies führt lediglich die PHP-Datei aus, der Echo-Inhalt in der Datei wird jedoch nicht auf dem Terminal ausgegeben. Zu diesem Zeitpunkt wird die neu erstellte log.txt-Datei verwendet. Nach dem Ausführen der Python-Datei haben wir die Protokolldatei überprüft und festgestellt, dass der Inhalt geschrieben wurde, sodass der CLI-Modus von PHP mit Python implementiert werden kann. ┗|`O′|┛ Wow~~


An diesem Punkt werden einige Schüler verwirrt sein, Sie haben Python verwendet, um den CLI-Modus von PHP zu implementieren, aber wie? Wie sieht es mit dem Fernzugriff über das Web aus? Zu diesem Zeitpunkt wird die exec-Methode von PHP verwendet. Wir wissen, dass die exec-Methode von PHP Befehlszeilenbefehle genau wie die os.system-Methode von Python ausführen kann, sodass wir eine neue test.php-Datei mit dem folgenden Inhalt erstellen können:
#!usr/bin/env python3`
#-*- coding:utf-8 -*-
import os
ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") #请使用自己系统的绝对路径
print(ret)

Dann greifen wir über die Webseite auf die Datei test.php zu. Die Ergebnisse sind wie folgt:


然后去log文件检查,发现也写入日志了,所以这个方法是可行的!

做到这里心里美滋滋的,不过老觉得好像哪里不对,终于终于意识到一个很傻逼的问题:既然PHP可以直接有命令行函数,为啥多此一举借助Python然后在用Python的函数呢?这不是脱了裤子放屁多此一举吗?

再大骂自己是傻逼N遍之后,我默默修改了test.php文件内容:

<?php
echo "begin<br>";
$program="/usr/local/php7/bin/php /home/app/nongyephp/swoole_test.php"; #注意使用绝对路径
(exec ($program));
echo "end<br>";
die;

在直接访问test.php文件,反馈结果和借助Python一样,这样就可以免去Python那一步,直接用PHP的exec函数来执行PHP文件。

结尾

测试通过后发现这种方法是可以创建定时器并且通过web远程使用的,不过有个问题,如果用和我上述一样用网页模拟会发现网页刷新是要等test.php执行完才会结束,也就是说如果我们把延时器的时间设成30分钟会要等待30分钟才会有反馈信息,这种方式肯定行不通的,所以需要使用异步访问,比如使用web的ajax技术和其他异步技术,这里不再赘述

尾巴

以上只是我想到解决问题的想法和实施步骤,到了真正开发可能不会选择这种方式,因为没有经过性能测试,而且对于进程控制和线程控制并没有多深入的了解,所以以后做订单自动取消还是会选择方法2的吧。
上述方法其实完全可以省掉Python那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧

相关推荐:

实例详解vue仿淘宝订单状态的tab切换效果

Java多订单多支付方式分配金额问题的解决

PHP实现以支付宝为例的RSA签名生成订单功能

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der verzögerten Bearbeitung von Bestellungen in PHP. 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