Ausführliche Erklärung von PHP anhand von Beanstalkd-Beispielen

藏色散人
Freigeben: 2023-04-06 13:08:02
nach vorne
3036 Leute haben es durchsucht

Die Grundkonzepte von Beanstalkd, Kompilierung und Yum-Installationsmethoden wurden im vorherigen Artikel „Detaillierte Erläuterung der Beanstalkd-Nachrichten-/Aufgabenwarteschlange“ vorgestellt. Heute werde ich den Prozess der Verwendung von Beanstalkd mit PHP üben. Am besten verwenden Sie die Pheanstalk-Klasse, um eine Verbindung zu Beanstalkd herzustellen

1. Verwenden Sie Composer, um Pheanstalk zu installieren

composer require pda/pheanstalk
Nach dem Login kopieren

2 🎜>php Sehen Sie sich das Beanstalkd-Statusskript Status.php an

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/21
 * Time: 10:32
 */
require "../vendor/autoload.php";
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk(&#39;192.168.75.135&#39;,11300);
print_r($pheanstalk->stats());
Nach dem Login kopieren

Produzentencode Producter.php

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/20
 * Time: 16:30
 */
require "../vendor/autoload.php";
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk(&#39;192.168.75.135&#39;,11300);
for ($i=0;$i<50;$i++){
    $data = array(
        &#39;key&#39; => &#39;testkey&#39;.$i,
        &#39;value&#39; => &#39;testvalue&#39;,
        &#39;time&#39; => time(),
    );
    $ret = $pheanstalk->putInTube(&#39;test-tube&#39;, json_encode($data), Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR);
    var_dump($ret);
}
Nach dem Login kopieren

Verbrauchercode Consumer.php

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/20
 * Time: 16:31
 */
set_time_limit(0);
ini_set(&#39;default_socket_timeout&#39;, 900);
require "../vendor/autoload.php";
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk(&#39;192.168.75.135&#39;,11300);
while (true){
    $job = $pheanstalk
        ->watch(&#39;test-tube&#39;)
        ->ignore(&#39;default&#39;)
        ->reserve();
    if ($job){
        sleep(2);
        echo $job->getData();
        echo "\n";
        $pheanstalk->delete($job);
    }
}
Nach dem Login kopieren

Öffnen Sie die Befehlszeile/ Terminalfenster und führen Sie den Producer aus, 50 Aufgaben werden in die Tube geschrieben

PS E:\repository\work\beanstalk> php .\Producter.php
int(101)
int(102)
int(103)
int(104)
int(105)
int(106)
int(107)
int(108)
int(109)
int(110)
int(111)
int(112)
int(113)
int(114)
......
Nach dem Login kopieren

Es ist ersichtlich, dass nach erfolgreichem Abschluss von $pheanstalk->putInTube die Job-ID zurückgegeben wird

Status anzeigen

PS E:\repository\work\beanstalk> php Status.php
Pheanstalk\Response\ArrayResponse Object
(
    [_name:Pheanstalk\Response\ArrayResponse:private] => OK
    [storage:ArrayObject:private] => Array
        (
            [current-jobs-urgent] => 0
            [current-jobs-ready] => 50
            [current-jobs-reserved] => 0
            [current-jobs-delayed] => 0
            [current-jobs-buried] => 0
            ......
Nach dem Login kopieren

Ergebnis Es zeigt, dass 50 Jobs im Bereitschaftszustand zum Lesen sind

Öffnen Sie zwei oder mehr Befehlszeilen-/Terminalfenster, führen Sie Verbraucher aus und simulieren Sie den Wettbewerb mehrerer Verbraucher

Verbraucher 1

PS E:\repository\work\beanstalk> php .\Consumer.php
{"key":"testkey0","value":"testvalue","time":1548039103}
{"key":"testkey1","value":"testvalue","time":1548039103}
{"key":"testkey2","value":"testvalue","time":1548039103}
{"key":"testkey4","value":"testvalue","time":1548039103}
{"key":"testkey6","value":"testvalue","time":1548039103}
{"key":"testkey8","value":"testvalue","time":1548039103}
{"key":"testkey10","value":"testvalue","time":1548039103}
{"key":"testkey12","value":"testvalue","time":1548039103}
{"key":"testkey14","value":"testvalue","time":1548039103}
{"key":"testkey16","value":"testvalue","time":1548039103}
{"key":"testkey18","value":"testvalue","time":1548039103}
{"key":"testkey20","value":"testvalue","time":1548039103}
{"key":"testkey22","value":"testvalue","time":1548039103}
{"key":"testkey24","value":"testvalue","time":1548039103}
{"key":"testkey26","value":"testvalue","time":1548039103}
{"key":"testkey28","value":"testvalue","time":1548039103}
{"key":"testkey30","value":"testvalue","time":1548039103}
{"key":"testkey32","value":"testvalue","time":1548039103}
{"key":"testkey34","value":"testvalue","time":1548039103}
{"key":"testkey36","value":"testvalue","time":1548039103}
{"key":"testkey38","value":"testvalue","time":1548039103}
{"key":"testkey40","value":"testvalue","time":1548039103}
{"key":"testkey42","value":"testvalue","time":1548039103}
{"key":"testkey44","value":"testvalue","time":1548039103}
{"key":"testkey46","value":"testvalue","time":1548039103}
{"key":"testkey48","value":"testvalue","time":1548039103}
Nach dem Login kopieren

Verbraucher 2

PS E:\repository\work\beanstalk> php .\Consumer.php
{"key":"testkey3","value":"testvalue","time":1548039103}
{"key":"testkey5","value":"testvalue","time":1548039103}
{"key":"testkey7","value":"testvalue","time":1548039103}
{"key":"testkey9","value":"testvalue","time":1548039103}
{"key":"testkey11","value":"testvalue","time":1548039103}
{"key":"testkey13","value":"testvalue","time":1548039103}
{"key":"testkey15","value":"testvalue","time":1548039103}
{"key":"testkey17","value":"testvalue","time":1548039103}
{"key":"testkey19","value":"testvalue","time":1548039103}
{"key":"testkey21","value":"testvalue","time":1548039103}
{"key":"testkey23","value":"testvalue","time":1548039103}
{"key":"testkey25","value":"testvalue","time":1548039103}
{"key":"testkey27","value":"testvalue","time":1548039103}
{"key":"testkey29","value":"testvalue","time":1548039103}
{"key":"testkey31","value":"testvalue","time":1548039103}
{"key":"testkey33","value":"testvalue","time":1548039103}
{"key":"testkey35","value":"testvalue","time":1548039103}
{"key":"testkey37","value":"testvalue","time":1548039103}
{"key":"testkey39","value":"testvalue","time":1548039103}
{"key":"testkey41","value":"testvalue","time":1548039103}
{"key":"testkey43","value":"testvalue","time":1548039103}
{"key":"testkey45","value":"testvalue","time":1548039103}
{"key":"testkey47","value":"testvalue","time":1548039103}
{"key":"testkey49","value":"testvalue","time":1548039103}
Nach dem Login kopieren

Die beiden Verbraucher konkurrierten um die Erledigung aller Aufgaben. Da die Binlog-Persistenz aktiviert ist, wenn mein Beanstalkd gestartet wird, gehen die Aufgaben nach dem Start von Beanstalkd nicht verloren neu gestartet

3. Dinge zu beachten

Beim Erstellen eines Jobs muss das festgelegte Timeout Pheanstalk::DEFAULT_TTR länger sein als die Zeit, die der Verbraucher benötigt Verarbeiten Sie einen Job, andernfalls wird der Job ausgeführt. Nach Ablauf der Zeit wird die Röhre in den Bereitschaftszustand versetzt und von anderen Verbrauchern abgerufen. Zu diesem Zeitpunkt verarbeitet der aktuelle Verbraucher den Job noch, was zu dem schrecklichen Phänomen eines Jobs führt wird wiederholt von mehreren Verbrauchern ausgeführt

2. Der Betreuer von Pheanstalk hat sich geändert. In der neuen Version von Pheanstalk werden lange Verbindungen nicht unterstützt, wenn die Zeit, die der Client-Socket zum Herstellen einer Verbindung mit dem Server benötigt, den festgelegten Standardwert überschreitet Wenn in php.ini der Job nicht von der Serverröhre abgerufen werden kann, wird die Verbindung getrennt. Daher muss der Verbraucherprozess aufrechterhalten werden, damit der Prozess nach dem Beenden neu gestartet werden kann. Es wird empfohlen, Supervisord zu verwenden, um den Verbraucher aufrechtzuerhalten Verfahren.

Code zur Bestimmung des Socket-Timeouts

public function getLine($length = null)
    {
        $timeout = ini_get(&#39;default_socket_timeout&#39;);
        $timer   = microtime(true);
        do {
            $data = isset($length) ?
                $this->_wrapper()->fgets($this->_socket, $length) :
                $this->_wrapper()->fgets($this->_socket);
            if ($this->_wrapper()->feof($this->_socket)) {
                throw new Exception\SocketException(&#39;Socket closed by server!&#39;);
            }
            if (($data === false) && microtime(true) - $timer > $timeout) {
                $this->disconnect();
                throw new Exception\SocketException(&#39;Socket timed out!&#39;);
            }
        } while ($data === false);
        return rtrim($data);
    }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von PHP anhand von Beanstalkd-Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:jmsite.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage