Heim >Backend-Entwicklung >PHP-Tutorial >Ausführliche Erklärung von PHP anhand von Beanstalkd-Beispielen

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

藏色散人
藏色散人nach vorne
2019-05-05 14:44:163072Durchsuche

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

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());

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);
}

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);
    }
}

Ö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)
......

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

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}

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}

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);
    }

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jmsite.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen