Maison > Article > développement back-end > Exemple de méthode pour implémenter le traitement des délais de commande en PHP
Récemment, lorsque je fais des affaires, je dois mettre en œuvre la fonction d'annulation automatique après que le client passe une commande après l'expiration du délai de commande et n'est pas payé. Je viens de confirmer plusieurs méthodes : Le client demande l'annulation. à l'heure et vérifie si le serveur a une heure programmée. Les commandes qui doivent être annulées sont ensuite traitées par lots. Créez une minuterie après avoir passé la commande. Utilisez redis
ou memcache
pour stocker le traitement différé. heure et supprimez-le automatiquement.
Compte tenu des méthodes ci-dessus, la première est éliminée en premier, car si le client désactive l'arrière-plan de l'APP ou la connexion réseau, la demande ne peut pas être envoyée au serveur et la commande sera toujours en un état non traité. ; La deuxième méthode est plus couramment utilisée, mais elle présente des problèmes de précision et le cycle des tâches planifiées doit être confirmée, elle est donc temporairement répertoriée comme méthode de sauvegarde. Le problème avec la quatrième méthode est que si la commande est effectuée ; est supprimé, il sera physiquement supprimé et ne pourra pas être compté. Les données non traitées (bien sûr, vous pouvez les stocker dans une base de données comme MySQL pour un stockage à long terme lors du stockage de Redis, puis utiliser la méthode 2 pour un traitement régulier).
Enfin, préparez-vous à utiliser la troisième méthode.
Lors de la confirmation de l'utilisation de la méthode 3, en raison de l'utilisation de PHP, un langage de développement, vous devez utiliser Swoole
ou workerman
pour implémenter la fonction timer. Puisque Swoole
est un framework d'extension développé par C
, ses performances sont nettement meilleures, j'ai donc choisi Swoole
.
Pour utiliser Swoole, vous devez d'abord installer l'extension Swoole
sur le serveur. La méthode d'installation est similaire à l'installation d'autres extensions. à cet article
Après l'installation, vérifiez si l'extension est installée normalement, cochez phpinfo
ou PHP-m
, si Swoole
apparaît, cela signifie que l'installation est réussie
Swoole
Les documents officiels ont des documents liés au minuteur
Nous créons un fichier swoole_test.php
et un log.txt
fichier (pour tester), swoole_test.php
Le code est le suivant :
<?php swoole_timer_after(3000, function () { append_log(time()); echo "after 3000ms.\n"; }); function append_log($str) { $dir = 'log.txt'; $fh = fopen($dir, "a"); fwrite($fh, $str."\n"); fclose($fh); }
Accédez ensuite à ce fichier PHP sur la page web, le résultat est le suivant :
Exécutez ensuite PHP dans le terminal Linux : /usr/local/php7/bin/php /home/app/swoole_test.php
, le résultat est le suivant :
J'ai ressenti une ruée à l'intérieur. . .
原来定时器只能在 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
,如果出现
则安装成功。
安装完 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′|┛ 嗷~~
到这里就会有同学疑惑了,你这使用 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的吧。
La méthode ci-dessus peut en fait omettre complètement l'étape Python
La raison pour laquelle je ne l'ai pas supprimée est d'écrire mon expérience de mise en œuvre, car je pense que ce genre d'étape inutile peut vraiment être rencontré. pendant le développement. La méthode, en bref, c'est de réfléchir davantage, de lire plus de code et de trouver les solutions qui peuvent être optimisées. Je sens que je suis loin derrière ici. Encourageons-nous les uns les autres.
Explication détaillée de PHP utilisant la file d'attente Redis pour réaliser une confirmation automatique de la réception des commandes de commerce électronique
Exemple d'explication détaillée du effet de changement d'onglet de Vue imitant le statut de la commande Taobao
PHP implémente la fonction de commande de génération de signature RSA en utilisant Alipay comme exemple
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!