Maison > Article > développement back-end > instructions d'utilisation de la requête php
Il est souvent nécessaire d'exécuter des tâches en arrière-plan dans les projets. Par exemple, lors de l'envoi d'e-mails, la connexion au serveur de messagerie prend souvent 5 à 10 secondes, voire plus, si vous pouvez d'abord donner à l'utilisateur un message réussi. message rapide, puis en arrière-plan. Gérer lentement l'opération d'envoi d'e-mails conduira évidemment à une meilleure expérience utilisateur.
Afin de répondre à des besoins similaires, la méthode générale d'implémentation dans les projets Web consiste à utiliser une file d'attente de messages (Message Queue), telle que MemcacheQ, RabbitMQ, etc., qui sont tous des produits bien connus.
Pour parler franchement, la file d'attente des messages est la file d'attente premier entré, premier sorti la plus simple, et un membre de la file d'attente est un morceau de texte. Précisément parce que la file d'attente des messages est si simple, lorsque vous maintenez la file d'attente des messages, vous vous sentez un peu confus quant par où commencer, car il ne s'agit que d'une tâche d'envoi d'e-mails, ce qui entraînera de nombreux problèmes :
La file d'attente des messages ne peut stocker que des données de type chaîne. Comment convertir une "tâche" telle que l'envoi d'un email en un "message" dans la file d'attente des messages ?
La file d'attente des messages. file d'attente de messages uniquement Responsable du stockage et de la saisie des données, il ne peut exécuter aucun programme lui-même, alors comment retirer les données une par une de la file d'attente de messages, puis reconvertir les données en tâches et les exécuter.
Nous ne pouvons pas prédire quand la file d'attente de messages générera des données, notre programme d'exécution de tâches doit donc également avoir la capacité de surveiller la file d'attente de messages, qui est un processus démon résidant en arrière-plan.
L'application web générale PHP fonctionne en mode cgi et ne peut pas résider en mémoire. Nous savons que PHP dispose également d'un mode CLI, le processus démon peut-il donc être implémenté avec PHP CLI et quelle est son efficacité ?
Lorsque le démon est en cours d'exécution, l'application Web peut-elle interagir avec le démon d'arrière-plan pour démarrer/arrêter le processus et obtenir l'état d'exécution du processus ?
Resque résout ces problèmes comme ceci :
En fait, depuis le ci-dessus Les problèmes sont déjà visibles. Une seule file d'attente de messages ne peut pas résoudre tous les problèmes et de nouveaux rôles sont nécessaires pour intervenir. Dans Resque, une tâche en arrière-plan est résumée comme étant accomplie par trois rôles :
Tâche | Tâche : une tâche qui doit être effectuée en arrière-plan, comme l'envoi d'e-mails en tant que un exemple dans cet article, il peut être résumé dans un Job. Dans Resque, un travail est une classe.
File d'attente | File d'attente : Il s'agit de la file d'attente des messages ci-dessus. Dans Resque, la file d'attente est implémentée par Redis. Resque fournit également un gestionnaire de files d'attente simple qui peut implémenter des fonctions telles que l'insertion/suppression de tâches de la file d'attente.
Worker | Executor : Responsable de retirer le travail de la file d'attente et de l'exécuter, et peut s'exécuter en arrière-plan en tant que démon.
Sur la base de cette division, le processus de base d'une tâche en arrière-plan sous Resque est le suivant :
Écrire une tâche en arrière-plan en tant que classe indépendante , cette classe est un travail.
Lorsque le programme d'arrière-plan doit être utilisé, le système met le nom de la classe d'emploi et les paramètres requis dans la file d'attente.
Ouvrez un Worker à partir de la ligne de commande et spécifiez la file d'attente que le Worker doit traiter via des paramètres.
Worker s'exécute comme un processus démon et vérifie régulièrement la file d'attente.
Lorsqu'il y a un Job dans la file d'attente, le Worker retire le Job et l'exécute, c'est-à-dire qu'il instancie la Job Class et exécute les méthodes de la Class.
Vous pouvez désormais effectuer une tâche en arrière-plan.
Dans Resque, il existe une autre conception très importante : un Worker peut gérer une ou plusieurs files d'attente, et la vitesse d'exécution de la file d'attente peut être accélérée en augmentant le nombre de processus/threads Worker.
Il convient de noter à l'avance que parce qu'il implique le développement et la gestion de processus, php-resque utilise la fonction PCNTL de php, il ne peut donc fonctionner que sous Linux. Et php est requis pour compiler la fonction PCNTL. Si vous souhaitez utiliser Windows pour effectuer le même travail, vous pouvez trouver d'autres versions linguistiques de Resque qui sont très inadaptées aux tâches en arrière-plan sous Windows.
Prenons Ubuntu12.04LTS comme exemple. Le php installé par Ubuntu à l'aide d'apt a compilé la fonction PCNTL par défaut. Aucune configuration n'est requise. Les instructions suivantes sont destinées au cours de formation informatique du compte root
apt-get install redis-server
apt-get install curl cd /usr/local/bin curl -s http://getcomposer.org/installer | php chmod a+x composer.phar alias composer='/usr/local/bin/composer.phar'
Supposons que le répertoire Web se trouve dans /opt/htdocs
apt-get install git git-core cd /opt/htdocs git clone git://github.com/chrisboulton/php-resque.git cd php-resque composer install
En fait, php-resque a donné un exemple simple Le fichier demo/job.php est le Job le plus simple :
class PHP_Job { public function perform() { sleep(120); fwrite(STDOUT, 'Hello!'); } }Ce Job affichera les caractères Hello! sur STDOUT après 120 secondes. Dans la conception de Resque, un Job doit avoir une méthode perform, et le Worker exécutera automatiquement cette méthode.
php-resque也给出了最简单的插入队列实现 demo/queue.php:
if(empty($argv[1])) { die('Specify the name of a job to add. e.g, php queue.php PHP_Job'); } require __DIR__ . '/init.php'; date_default_timezone_set('GMT'); Resque::setBackend('127.0.0.1:6379'); $args = array( 'time' => time(), 'array' => array( 'test' => 'test', ), ); $jobId = Resque::enqueue('default', $argv[1], $args, true); echo "Queued job ".$jobId."\n\n";
在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id。在终端输入:
php demo/queue.php PHP_Job
结果可以看到屏幕上输出:
Queued job b1f01038e5e833d24b46271a0e31f6d6
即Job已经添加成功。注意这里的Job名称与我们编写的Job Class名称保持一致:PHP_Job
php-resque同样提供了查看Job运行状态的例子,直接运行:
php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
可以看到输出为:
Tracking status of b1f01038e5e833d24b46271a0e31f6d6. Press [break] to stop. Status of b1f01038e5e833d24b46271a0e31f6d6 is: 1
我们刚才创建的Job状态为1。在Resque中,一个Job有以下4种状态:
Resque_Job_Status::STATUS_WAITING = 1; (等待)
Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
Resque_Job_Status::STATUS_FAILED = 3; (失败)
Resque_Job_Status::STATUS_COMPLETE = 4; (结束)
因为没有Worker运行,所以刚才创建的Job还是等待状态。
这次我们直接编写demo/resque.php:
<?php date_default_timezone_set('GMT'); require 'job.php'; require '../bin/resque';
可以看到一个Worker至少需要两部分:
可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载
包含Resque的默认Worker: bin/resque
在终端中运行:
QUEUE=default php demo/resque.php
前面的QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列。也可以使用
QUEUE=* php demo/resque.php
来处理所有队列。
运行后输出为
#!/usr/bin/env php *** Starting worker
用ps指令检查一下:
ps aux | grep resque
可以看到有一个php的守护进程已经在运行了
1000 4607 0.0 0.1 74816 11612 pts/3 S+ 14:52 0:00 php demo/resque.php
再使用之前的检查Job指令
php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
2分钟后可以看到
Status of b1f01038e5e833d24b46271a0e31f6d6 is: 4
任务已经运行完毕,同时屏幕上应该可以看到输出的Hello!
至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明。
相关推荐:
利用redis和php-resque实现后台任务 redis 下载 redis 集群 redis可视化工具
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!