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('192.168.75.135',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('192.168.75.135',11300); for ($i=0;$i<50;$i++){ $data = array( 'key' => 'testkey'.$i, 'value' => 'testvalue', 'time' => time(), ); $ret = $pheanstalk->putInTube('test-tube', 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('default_socket_timeout', 900); require "../vendor/autoload.php"; use Pheanstalk\Pheanstalk; $pheanstalk = new Pheanstalk('192.168.75.135',11300); while (true){ $job = $pheanstalk ->watch('test-tube') ->ignore('default') ->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 beachtenBeim 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('default_socket_timeout'); $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('Socket closed by server!'); } if (($data === false) && microtime(true) - $timer > $timeout) { $this->disconnect(); throw new Exception\SocketException('Socket timed out!'); } } 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!