Maison  >  Article  >  développement back-end  >  Explication détaillée du retard de traitement des commandes en PHP

Explication détaillée du retard de traitement des commandes en PHP

小云云
小云云original
2018-01-01 10:40:421212parcourir

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 un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. ça peut suivre Apprenons avec l’éditeur.

Exigences commerciales

La commande est une fonction que nous rencontrons souvent dans le développement quotidien. Récemment, lorsque nous faisons des affaires, nous devons mettre en œuvre l'annulation automatique une fois que le client a passé la commande et la commande. expire et n'est pas payant, nous venons de confirmer plusieurs méthodes :

  • Le client demande l'annulation à ce moment

  • Le serveur régulièrement. vérifie s'il est nécessaire d'annuler la commande, puis la traite par lots

  • Créer une minuterie après avoir passé la commande, retarder le traitement

  • Utilisez le stockage Redis ou Memcache, définissez le délai d'expiration, supprimez 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, alors la demande ne peut pas être envoyée au serveur et la commande restera. Elle est dans un état non traité ; la deuxième méthode est utilisée plus souvent, mais il y a des problèmes d'exactitude et la nécessité de confirmer la période de la tâche planifié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 supprimée, elle sera physiquement supprimée, les données non traitées ne peuvent pas être comptées (bien sûr, vous pouvez les stocker dans une base de données comme MySQL pour un stockage à long terme lors de la sauvegarde) redis, puis utilisez 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. La méthode d'installation est similaire à l'installation d'autres extensions. référez-vous à cet article

  • 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

  • La documentation officielle de Swoole est disponible Documents relatifs au Timer

Commencer les tests

Nous créons un fichier swoole_test.php et un fichier log.txt (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 = &#39;log.txt&#39;;
 $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 :

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

Je me sentais un peu nerveux. . .

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)

Puis nous l'exécutons dans le terminal : /usr/bin/python3 / home/app /test.py, remarque : il s'agit simplement d'exécuter le fichier PHP, mais le contenu de l'écho dans le fichier ne sera pas affiché sur le terminal. À ce 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′|┛ Wow~~


À ce stade, certains étudiants seront confus. Vous avez utilisé Python pour implémenter le mode cli de PHP, mais comment ? Qu’en est-il de l’accès à distance via le Web ? À l'heure actuelle, la méthode exec de PHP est utilisée. Nous savons que la méthode exec de PHP peut exécuter des commandes en ligne de commande comme la méthode os.system de Python, nous pouvons donc créer un nouveau fichier test.php avec le contenu suivant :

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

Ensuite, nous accédons au fichier test.php via la page Web. Les résultats sont les suivants :


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

相关推荐:

实例详解vue仿淘宝订单状态的tab切换效果

Java多订单多支付方式分配金额问题的解决

PHP实现以支付宝为例的RSA签名生成订单功能

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