5

PHPスクリプトからメッセージを発行する必要があります。単一のメッセージを発行できます。しかし、今はループでさまざまなメッセージを公開する必要があります。それを行う適切な方法が見つかりません。これが私が試したことです:

$counter = 0;
$closure = function (\Thruway\ClientSession $session) use ($connection, &$counter) {
//$counter will be always 5
$session->publish('com.example.hello', ['Hello, world from PHP!!! '.$counter], [], ["acknowledge" => true])->then(
    function () use ($connection) {
        $connection->close(); //You must close the connection or this will hang
        echo "Publish Acknowledged!\n";
    },
        function ($error) {
        // publish failed
            echo "Publish Error {$error}\n";
        }
    );
};

while($counter<5){

    $connection->on('open', $closure);

    $counter++;
}
$connection->open();

ここで $counter 値をサブスクライバーに公開したいのですが、値は常に 5 です。1. ループの前に接続を開き、ループ内でメッセージを公開する方法はありますかループ?

ありがとう!

4

1 に答える 1

5

これを実現するには、いくつかの方法があります。最も簡単に:

$client = new \Thruway\Peer\Client('realm1');
$client->setAttemptRetry(false);
$client->addTransportProvider(new \Thruway\Transport\PawlTransportProvider('ws://127.0.0.1:9090'));

$client->on('open', function (\Thruway\ClientSession $clientSession) {
    for ($i = 0; $i < 5; $i++) {
        $clientSession->publish('com.example.hello', ['Hello #' . $i]);
    }
    $clientSession->close();
});

$client->start();

ルーターへの短い接続を何度も行っても問題はありません。ただし、デーモンプロセスで実行している場合は、同じクライアント接続を使用するだけのものをセットアップし、while(1) の代わりに反応ループを使用してループを管理する方がおそらく理にかなっています。

$loop = \React\EventLoop\Factory::create();

$client = new \Thruway\Peer\Client('realm1', $loop);
$client->addTransportProvider(new \Thruway\Transport\PawlTransportProvider('ws://127.0.0.1:9090'));

$loop->addPeriodicTimer(0.5, function () use ($client) {

    // The other stuff you want to do every half second goes here

    $session = $client->getSession();

    if ($session && ($session->getState() == \Thruway\ClientSession::STATE_UP)) {
        $session->publish('com.example.hello', ['Hello again']);
    }
});

$client->start();

$loop がクライアント コンストラクターに渡されていることに注意してください。また、自動再接続を無効にする行を削除したことにも注意してください (ネットワークに問題がある場合、スクリプトは再接続します)。

于 2015-07-13T18:47:19.640 に答える