instructions d'utilisation de la requête php

小云云
Libérer: 2023-03-20 12:32:01
original
2509 Les gens l'ont consulté

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 :

  1. 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 ?

  2. 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.

  3. 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.

  4. 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é ?

  5. 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 :

Division des rôles des tâches en arrière-plan

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 :

  1. Écrire une tâche en arrière-plan en tant que classe indépendante , cette classe est un travail.

  2. 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.

  3. 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.

  4. Worker s'exécute comme un processus démon et vérifie régulièrement la file d'attente.

  5. 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.

Installation de php-resque

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

. Installez Redis

apt-get install redis-server
Copier après la connexion

Installez Composer

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'
Copier après la connexion

Utilisez Composer pour installer php-resque

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
Copier après la connexion

php-resque Utilisez

pour écrire un Worker

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!');
    }
}
Copier après la connexion
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.

将Job插入队列

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";
Copier après la connexion

在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id。在终端输入:

php demo/queue.php PHP_Job
Copier après la connexion

结果可以看到屏幕上输出:

Queued job b1f01038e5e833d24b46271a0e31f6d6
Copier après la connexion

即Job已经添加成功。注意这里的Job名称与我们编写的Job Class名称保持一致:PHP_Job

查看Job运行情况

php-resque同样提供了查看Job运行状态的例子,直接运行:

php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
Copier après la connexion
Copier après la connexion

可以看到输出为:

Tracking status of b1f01038e5e833d24b46271a0e31f6d6. Press [break] to stop. 
Status of b1f01038e5e833d24b46271a0e31f6d6 is: 1
Copier après la connexion

我们刚才创建的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还是等待状态。

运行Worker

这次我们直接编写demo/resque.php:

<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';
Copier après la connexion

可以看到一个Worker至少需要两部分:

  1. 可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载

  2. 包含Resque的默认Worker: bin/resque

在终端中运行:

QUEUE=default php demo/resque.php
Copier après la connexion

前面的QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列。也可以使用

QUEUE=* php demo/resque.php
Copier après la connexion

来处理所有队列。

运行后输出为

#!/usr/bin/env php
*** Starting worker
Copier après la connexion

用ps指令检查一下:

ps aux | grep resque
Copier après la connexion

可以看到有一个php的守护进程已经在运行了

1000      4607  0.0  0.1  74816 11612 pts/3    S+   14:52   0:00 php demo/resque.php
Copier après la connexion

再使用之前的检查Job指令

php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
Copier après la connexion
Copier après la connexion

2分钟后可以看到

Status of b1f01038e5e833d24b46271a0e31f6d6 is: 4
Copier après la connexion

任务已经运行完毕,同时屏幕上应该可以看到输出的Hello!

至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明。

相关推荐:

利用redis和php-resque实现后台任务 redis 下载 redis 集群 redis可视化工具

php网站设计 php-resque的设计和使用

php-resque消息队列的执行情况

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!