Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont PHP implémente le traitement différé des commandes

Explication détaillée de la façon dont PHP implémente le traitement différé des commandes

韦小宝
韦小宝original
2017-12-30 16:12:221318parcourir

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 = &#39;log.txt&#39;;
 $fh = fopen($dir, "a");
 fwrite($fh, $str."\n");
 fclose($fh);
}
<.>

Accédez ensuite à ce fichier PHP sur la page web, les résultats sont les suivants :

Ensuite exécutez PHP dans le terminal Linux : /usr/local/php7/bin/ php /home/app/swoole_test.php, les résultats sont les suivants :

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 !


Oui, nous ne pouvons pas nous fier uniquement à PHP, il existe également un langage magique comme Python. Nous savons que la méthode os.system du module os de Python peut exécuter la ligne de commande, donc non. vous exécutez le fichier swoole_test.php tout à l'heure en mode cli ?


Après m'être senti excité, je me suis demandé si le test était réalisable


Nous savons que Linux est tous livré avec Python, mais différentes versions ont différentes versions de Python, et certaines sont livrées avec Il s'agit de Python2.6. La version est trop basse, vous devez donc installer une version supérieure. Ici, je choisis Python3, et faites attention à ne pas écraser le Python2 fourni avec le système. Voici les étapes d'installation approximatives :

  • 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

Ensuite, saisissez : Python3 dans le terminal Si


apparaît. , l'installation est réussie.


Après avoir installé Python3, nous créons un nouveau fichier test.py avec le contenu suivant :

#!usr/bin/env python3`
#-*- coding:utf-8 -*-
import os
ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") #请使用自己系统的绝对路径
print(ret)

Ensuite, nous ouvrons le terminal Exécution : /usr/bin/python3 /home/app/test.py Remarque : il s'agit simplement de l'exécution du fichier PHP, mais le contenu de l'écho dans le fichier ne sera pas affiché sur le terminal pour le moment. le fichier log.txt nouvellement créé sera utilisé. Après avoir exécuté le fichier Python, nous avons vérifié le fichier journal et constaté que le contenu avait été écrit, le mode cli de PHP peut donc être implémenté à l'aide de Python. ┗|`O′|┛ Aïe~~


到这里就会有同学疑惑了,你这使用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关键字标红处理类

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn