Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Resque-Nutzungsanweisungen

PHP-Resque-Nutzungsanweisungen

小云云
小云云Original
2018-02-24 15:30:222504Durchsuche

In Projekten besteht häufig die Notwendigkeit, Aufgaben im Hintergrund auszuführen. Beim Versenden von E-Mails dauert es beispielsweise oft 5-10 Sekunden oder sogar länger, bis eine Verbindung zum Mailserver hergestellt ist Prompt-Nachricht, und dann im Hintergrund Die langsame Abwicklung des E-Mail-Versandvorgangs führt offensichtlich zu einer besseren Benutzererfahrung.

Um ähnliche Anforderungen zu erfüllen, besteht die allgemeine Implementierungsmethode in Webprojekten darin, Nachrichtenwarteschlangen (Message Queue) wie MemcacheQ, RabbitMQ usw. zu verwenden, die allesamt bekannte Produkte sind.

Um es ganz klar auszudrücken: Die Nachrichtenwarteschlange ist die einfachste First-In-First-Out-Warteschlange, und ein Mitglied der Warteschlange ist ein Textstück. Gerade weil die Nachrichtenwarteschlange so einfach ist, sind Sie beim Halten der Nachrichtenwarteschlange etwas verwirrt darüber, wo Sie anfangen sollen, da dies nur eine Aufgabe des E-Mail-Versands ist, die zu vielen Problemen führen wird:

  1. Die Nachrichtenwarteschlange kann nur Daten vom Typ Zeichenfolge speichern, z. B. das Senden einer E-Mail in eine „Nachricht“ in der Nachrichtenwarteschlange?

  2. Die Nur Nachrichtenwarteschlange Es ist für die Speicherung und Eingabe von Daten verantwortlich und kann selbst kein Programm ausführen. Wie nehmen wir also die Daten einzeln aus der Nachrichtenwarteschlange heraus, konvertieren die Daten dann wieder in Aufgaben und führen sie aus?

  3. Wir können nicht vorhersagen, wann die Nachrichtenwarteschlange Daten generieren wird, daher muss unser Aufgabenausführungsprogramm auch in der Lage sein, die Nachrichtenwarteschlange zu überwachen, bei der es sich um einen im Hintergrund residenten Daemon-Prozess handelt.

  4. Allgemeine Webanwendung PHP läuft im CGI-Modus und kann nicht im Speicher resident sein. Wir wissen, dass PHP auch über einen CLI-Modus verfügt. Kann der Daemon-Prozess also mit der PHP-CLI implementiert werden und wie effizient ist er?

  5. Kann die Webanwendung bei laufendem Daemon mit dem Hintergrunddämon interagieren, um den Prozess zu starten/beenden und den Ausführungsstatus des Prozesses zu erhalten?


Resque löst diese Probleme folgendermaßen:

Rollenaufteilung der Hintergrundaufgaben

Tatsächlich von der Oben Die Probleme sind bereits zu erkennen. Nur eine Nachrichtenwarteschlange kann nicht alle Probleme lösen, und es sind neue Rollen erforderlich, um einzugreifen. In Resque wird eine Hintergrundaufgabe durch drei Rollen abstrahiert:

  • Auftragsaufgabe: Ein Auftrag ist eine Aufgabe, die im Hintergrund erledigt werden muss, z. B. das Versenden von E-Mails als Ein Beispiel in diesem Artikel, es kann in einen Job abstrahiert werden. In Resque ist ein Job eine Klasse.

  • Warteschlange |. Dies ist die Nachrichtenwarteschlange oben. In Resque wird die Warteschlange von Redis implementiert. Resque bietet außerdem einen einfachen Warteschlangenmanager, der Funktionen wie das Einfügen/Entfernen von Jobs aus der Warteschlange implementieren kann.

  • Worker |. Verantwortlich für das Herausnehmen des Jobs aus der Warteschlange und dessen Ausführung und kann im Hintergrund als Daemon ausgeführt werden.

Basierend auf dieser Unterteilung ist der grundlegende Prozess einer Hintergrundaufgabe unter Resque wie folgt:

  1. Schreiben Sie eine Hintergrundaufgabe als unabhängige Klasse , diese Klasse ist ein Job.

  2. Wo das Hintergrundprogramm verwendet werden muss, stellt das System den Namen der Jobklasse und die erforderlichen Parameter in die Warteschlange.

  3. Öffnen Sie einen Worker über die Befehlszeile und geben Sie über Parameter die Warteschlange an, die der Worker verarbeiten muss.

  4. Worker läuft als Daemon-Prozess und überprüft regelmäßig die Warteschlange.

  5. Wenn sich ein Job in der Warteschlange befindet, nimmt der Worker den Job heraus und führt ihn aus, das heißt, er instanziiert die Jobklasse und führt die Methoden in der Klasse aus.

Jetzt können Sie eine Hintergrundaufgabe abschließen.

In Resque gibt es ein weiteres sehr wichtiges Design: Ein Worker kann eine oder mehrere Warteschlangen verwalten, und die Ausführungsgeschwindigkeit der Warteschlange kann durch Erhöhen der Anzahl der Worker-Prozesse/Threads beschleunigt werden.

Installation von php-resque

Es sollte im Voraus beachtet werden, dass php-resque die PCNTL-Funktion von PHP verwendet, da es sich um Prozessentwicklung und -verwaltung handelt, sodass es nur unter Linux ausgeführt werden kann. Und PHP ist erforderlich, um die PCNTL-Funktion zu kompilieren. Wenn Sie Windows für die gleiche Arbeit verwenden möchten, sind andere Sprachversionen von Resque für Hintergrundaufgaben unter Windows sehr ungeeignet.

Nehmen Sie Ubuntu12.04LTS als Beispiel. Das von Ubuntu mit apt installierte PHP hat standardmäßig keine Konfiguration erforderlich. Die folgenden Anweisungen gelten für den Root-Konto-Computerschulungskurs Installieren Sie Redis

Installieren Sie Composer
apt-get install redis-server

Verwenden Sie Composer, um php-resque zu installieren
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'

Angenommen, das Webverzeichnis befindet sich in /opt/htdocs

php-resque Verwenden Sie
apt-get install git git-core
cd /opt/htdocs
git clone git://github.com/chrisboulton/php-resque.git
cd php-resque
composer install

, um einen Worker zu schreiben

Tatsächlich hat php-resque ein einfaches Beispiel gegeben. Die Datei demo/job.php ist der einfachste Job:

Dieser Job gibt das Zeichen Hello!
class PHP_Job
{
    public function perform()
    {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
    }
}

nach 120 Sekunden auf STDOUT aus. Im Design von Resque muss ein Job über eine Perform-Methode verfügen, und der Worker führt diese Methode automatisch aus.

将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";

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

php demo/queue.php PHP_Job

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

Queued job b1f01038e5e833d24b46271a0e31f6d6

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

查看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还是等待状态。

运行Worker

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

<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';

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

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

  2. 包含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可视化工具

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

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

Das obige ist der detaillierte Inhalt vonPHP-Resque-Nutzungsanweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn