Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung, wie PHP die verzögerte Bearbeitung von Bestellungen implementiert

Ausführliche Erläuterung, wie PHP die verzögerte Bearbeitung von Bestellungen implementiert

韦小宝
韦小宝Original
2017-12-30 16:12:221358Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Verwendung von PHP zur Implementierung der verzögerten Verarbeitung von Bestellungen ein. Der Artikel stellt es ausführlich anhand des PHP-Beispielcodes vor ist für jeden sehr nützlich. Das Erlernen von PHP hat einen gewissen Referenz-Lernwert. Freunde, die es benötigen, können dem Editor folgen, um gemeinsam zu lernen.

Geschäftsanforderungen

Ordnung ist eine Funktion, die uns in der täglichen Entwicklung häufig begegnet Realisieren Sie die Funktion der automatischen Stornierung, nachdem der Kunde die Bestellung aufgegeben hat und die Bestellung abgelaufen ist und die Zahlung nicht erfolgt ist. Zu Beginn wurden mehrere Methoden bestätigt:

  • Der Kunde beantragt eine Stornierung, wenn Es ist soweit

  • Der Server prüft regelmäßig, ob es Bestellungen gibt, die storniert werden müssen, und verarbeitet diese dann stapelweise

  • Erstellen Sie eine Timer nach der Bestellung und Verzögerung der Verarbeitung

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

Berücksichtigen Sie die oben genannten Methoden Die erste Methode wird zuerst eliminiert, denn wenn der Kunde den APP-Hintergrund oder die Netzwerkverbindung verbietet, kann die Anfrage nicht an den Server gesendet werden und die Bestellung bleibt immer unbearbeitet. Die zweite Methode wird häufiger verwendet, es gibt jedoch Genauigkeit Probleme und der Zeitraum der geplanten Aufgabe müssen bestätigt werden, daher wird sie vorübergehend als zusätzliche Methode aufgeführt. Das Problem bei den vier Methoden besteht darin, dass die Bestellung physisch gelöscht wird und nicht verarbeitete Daten nicht gezählt werden können (Natürlich können Sie es beim Speichern von Redis zur Langzeitspeicherung in einer Datenbank wie MySQL speichern und dann Methode 2 für die regelmäßige Verarbeitung verwenden.)

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 verwenden zu können, müssen Sie zunächst die Swoole-Erweiterung auf dem Server installieren. Installationsmethode und Installation Andere Erweiterungen sind ähnlich, Sie können den Artikel hier lesen

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

  • Die offiziellen Swoole-Dokumente enthalten Timer-bezogene Dokumente

Testen starten

Wir erstellen eine swoole_test.php-Datei und eine log.txt-Datei (zum Testen). Der swoole_test.php-Code lautet 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);
}

Dann greifen Sie auf diese PHP-Datei auf der Webseite zu, die Ergebnisse sind wie folgt:

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

Ich verspürte einen inneren Rausch. . .

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:

#!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 öffnen wir die Terminal-Ausführung: /usr/bin/python3 /home/app/test.py Hinweis: Dies ist nur die Ausführung der PHP-Datei, aber der Echo-Inhalt in der Datei wird zu diesem Zeitpunkt nicht ausgegeben. Es 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′|┛ Autsch~~


到这里就会有同学疑惑了,你这使用Python实现了PHP的cli模式,但是怎么通过web远程访问呢?这个时候就用到PHP的exec方法了,我们知道PHP的exec方法和Python的os.system方法一样是可以执行命令行命令的,所以我们可以新建一个test.php文件,内容如下:

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

然后我们通过网页访问test.php文件。结果如下:


然后去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那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧

以上就是本篇文章的所有内容,希望对大家有所帮助!

相关推荐:

消息队列 - 有没有好的php延时队列

php函数的引用 php延时函数 php排序函

PHP关键字标红处理类

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung, wie PHP die verzögerte Bearbeitung von Bestellungen implementiert. 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