ホームページ  >  記事  >  バックエンド開発  >  Beanstalkd の例を使用した PHP の詳細な説明

Beanstalkd の例を使用した PHP の詳細な説明

藏色散人
藏色散人転載
2019-05-05 14:44:163047ブラウズ

Beanstalkdの基本概念やコンパイル、yumのインストール方法などは前回の記事「Beanstalkdのメッセージ/タスクキューの詳細解説」で紹介しましたので、今回はPHPでBeanstalkdを使う手順を実践していきます。最善の方法は、Pheanstalk クラスを使用して Beanstalkd

1 に接続することです。Composer を使用して Pheanstalk

composer require pda/pheanstalk

2 をインストールします。コードを実装します

php Beanstalkd ステータス スクリプトの表示 Status.php

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

プロデューサー コード 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);
}

コンシューマ コード 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);
    }
}

コマンド ラインを開く/terminal window にアクセスしてプロデューサーを実行すると、50 個のタスクがチューブに書き込まれます

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

$pheanstalk->putInTube が成功すると、ジョブの ID が返されることがわかります

ステータスの表示

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

結果読み取り準備完了状態のジョブが 50 個あることが表示されます

コマンド ライン/ターミナル ウィンドウを 2 つ以上開き、コンシューマを実行し、複数コンシューマの競合をシミュレートします

コンシューマ 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}

コンシューマ 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}

2 人のコンシューマがすべてのタスクを完了するために競合しました。Beantalkd はバイナリログ永続性を有効にして開始したため、Beantalkd の再起動後もタスクは失われません

3. 注意事項

1. ジョブを作成するとき、設定されたタイムアウト Pheanstalk::DEFAULT_TTR は、コンシューマーの処理にかかる時間よりも長くなければなりませんタイムアウト後、チューブは準備完了状態に変更され、他のコンシューマによって取得されます。この時点では、現在のコンシューマはまだジョブを処理中であるため、ジョブが失われるという恐ろしい現象が発生します。複数のコンシューマによって繰り返し実行されます。

2. Pheanstalk のメンテナが変更されました。Pheanstalk の新しいバージョンでは、長時間の接続はサポートされていません。クライアント ソケットがサーバーに接続する時間が、設定されているdefault_socket_timeout を超えた場合php.ini では、サーバー チューブからジョブを取得できない場合、接続が切断されるため、コンシューマ プロセスを終了後に再起動できるようにコンシューマ プロセスをメンテナンスする必要があります。コンシューマ プロセスをメンテナンスするには、supervisord を使用することをお勧めします。プロセス。

ソケットのタイムアウトを決定するコード

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


以上がBeanstalkd の例を使用した PHP の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjmsite.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。