Cet article vous présente principalement les informations pertinentes sur la façon d'utiliser PHP pour implémenter le traitement différé des commandes. L'article le présente en détail à travers l'exemple de code PHP, qui est très utile pour tout le monde. Apprendre PHP ou travailler a une certaine valeur d'apprentissage de référence. Les amis qui en ont besoin peuvent suivre l'éditeur pour apprendre ensemble.
Exigences commerciales
L'ordre est une fonction que nous rencontrons souvent dans le développement quotidien Récemment, lorsque nous faisons des affaires, il est nécessaire de. réaliser la fonction d'annulation automatique une fois que le client a passé la commande et que la commande expire et que le paiement n'est pas effectué Plusieurs méthodes ont été confirmées au début :
Le client demande l'annulation lorsque. le moment vient
Le serveur vérifie régulièrement s'il y a des commandes qui doivent être annulées, puis les traite par lots
Créer un minuterie après avoir passé la commande et retarder le traitement
Utilisez le stockage Redis ou Memcache, définissez le délai d'expiration et supprimez automatiquement
Compte tenu des méthodes ci-dessus , la première est éliminée en premier, car si le client interdit l'arrière-plan de l'APP ou la connexion réseau, alors la demande ne peut pas être envoyée au serveur et la commande restera toujours non traitée. La deuxième méthode est plus couramment utilisée, mais elle est précise ; problèmes, et la période de la tâche planifiée doit être confirmée, elle est donc temporairement répertoriée comme méthode supplémentaire ; Le problème avec les quatre méthodes est que si la commande est supprimée, elle sera physiquement supprimée et les données non traitées ne peuvent pas être comptées ; (bien sûr, vous pouvez le 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 du langage de développement PHP utilisé, vous devez utiliser Swoole ou Workerman pour implémenter la fonction timer. Puisque Swoole est un framework d'extension développé en C, il est nettement meilleur en termes de performances, j'ai donc choisi Swoole.
Préparation
Pour utiliser Swoole, vous devez d'abord installer l'extension Swoole sur le serveur, méthode d'installation et installation D'autres extensions sont similaires, vous pouvez vous référer à l'article ici
Après l'installation, vérifiez si l'extension est installée normalement, vérifiez phpinfo ou PHP-m, si Swoole apparaît, cela signifie que l'installation est réussie
Les documents officiels de Swoole contiennent des documents relatifs à la minuterie
Commencer les tests
Nous créons un fichier swoole_test.php et un fichier log.txt (pour les tests). Le code swoole_test.php 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); }
J'ai ressenti une ruée à l'intérieur. . . Il s'avère que la minuterie ne peut être utilisée qu'en mode cli, donc cette idée va probablement être GG. Est-ce là qu'elle tombe ? Juste au moment où j'étais sur le point de pleurer sans larmes, soudain une idée m'est venue, et un mot m'est venu à l'esprit : Python !
#!usr/bin/env python3` #-*- coding:utf-8 -*- import os ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") #请使用自己系统的绝对路径 print(ret)
到这里就会有同学疑惑了,你这使用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那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧
以上就是本篇文章的所有内容,希望对大家有所帮助!
相关推荐:
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!