Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

小云云
小云云Original
2018-03-09 17:50:272465Durchsuche

Vor kurzem muss ich im Geschäftsleben die Funktion der automatischen Stornierung implementieren, nachdem der Kunde eine Bestellung aufgegeben hat, nachdem die Bestellung abgelaufen ist und nicht bezahlt wurde: Der Kunde beantragt eine Stornierung zu diesem Zeitpunkt und prüft, ob Bestellungen, die storniert werden müssen, stapelweise verarbeitet werden. Verwenden Sie redis oder memcache, um den Ablauf zu speichern Zeit und löscht es 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, kann die Anfrage nicht an den Server gesendet werden und die Bestellung bleibt immer erhalten ; Die zweite Methode wird häufiger verwendet, weist jedoch Probleme mit der Genauigkeit auf und der Zyklus geplanter Aufgaben muss bestätigt werden. Daher wird sie vorübergehend als Backup-Methode aufgeführt Wird gelöscht, werden sie physisch gelöscht und können nicht gezählt werden. Unverarbeitete Daten (natürlich können Sie sie beim Speichern von Redis zur Langzeitspeicherung 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 Verwendung von PHP, einer Entwicklungssprache, Swoole oder workerman verwenden, um die Timer-Funktion zu implementieren. Da Swoole ein von C entwickeltes Erweiterungsframework ist, ist seine Leistung definitiv besser, also habe ich Swoole gewählt.

Vorbereitung

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

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

  • Swoole Die offiziellen Dokumente enthalten timerbezogene Dokumente

Testen beginnen

Wir erstellen eine swoole_test.php-Datei und eine log.txt Datei (zum Testen), swoole_test.phpDer 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, das Ergebnis ist wie folgt: Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

Führen Sie dann PHP im Linux-Terminal aus: /usr/local/php7/bin/php /home/app/swoole_test.php, das Ergebnis ist wie folgt:

Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

Ich verspürte einen Rausch in mir. . .

原来定时器只能在 cli 模式下,那么这个想法怕是要GG了,难道就栽倒这里了吗,难道就没有别的方法了吗?就在我欲哭无泪的时候突然灵光乍现,一个词闪到我的脑海: Python !

对,我们不能单单靠着 PHP 啊,还有 Python 这种神奇的语言呢,我们知道 Python 的 os 模块里的 os.system 方法是可以执行命令行的,那么不就可以实现在 cli 模式下运行刚才的 swoole_test.php 文件了么。

内心一阵激动后,觉得测试是否可行

我们知道 Linux 都是自带 Python 的,但是不同的版本 Python 版本不同,有的自带的是 Python2.6 ,版本过低了,所以需要装一个高版本的,这里我选择 Python3 ,注意不要覆盖系统自带的 Python2 。以下是大致的安装步骤:

  • wget http://python.org/ftp/python/...
    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

接下来终端输入: Python3 ,如果出现

Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

则安装成功。

安装完 Python3 之后,我们新建一个 test.py 文件,内容如下:

#!usr/bin/env python3`
#-*- coding:utf-8 -*-

import os
ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") 
#请使用自己系统的绝对路径
print(ret)

然后我们在终端执行: /usr/bin/python3 /home/app/test.py ,注意:这里只是执行 PHP 文件,但是文件里的 echo 内容是不会在终端输出的,这时候就用到刚才新建的 log.txt 文件了。执行完 Python 文件后,我们去log文件检查下,发现内容已经写入,所以使用 Python 是可以实现 PHP 的 cli 模式的。┗|`O′|┛ 嗷~~

Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in PHP

到这里就会有同学疑惑了,你这使用 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 文件。结果如下:

Beispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung in 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的吧。

  • Die obige Methode kann den Schritt Python tatsächlich vollständig weglassen. Der Grund, warum ich ihn nicht entfernt habe, besteht darin, meine Implementierungserfahrung aufzuschreiben, da ich denke, dass ein solcher unnötiger Schritt tatsächlich auftreten kann Kurz gesagt, die Methode besteht darin, mehr nachzudenken, mehr Code zu lesen und die Lösungen herauszufinden, die hier optimiert werden können. Lassen Sie uns einander ermutigen

    Verwandte Empfehlungen:

Ausführliche Erklärung von PHP mithilfe der Redis-Warteschlange, um eine automatische Empfangsbestätigung von E-Commerce-Bestellungen zu realisieren

Beispiel für eine detaillierte Erklärung Tab-Wechsel-Effekt von Vue, der den Taobao-Bestellstatus imitiert

PHP implementiert die RSA-Signaturgenerierungs-Bestellfunktion am Beispiel von Alipay

Das obige ist der detaillierte Inhalt vonBeispiel einer Methode zur Implementierung der Auftragsverzögerungsverarbeitung 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