2015-07-13 30 views
4

我需要從php腳本發佈消息,我可以發佈一條消息。但現在我需要在循環發佈不同的信息,無法找到正確的方式該怎麼辦呢,這裏是我的嘗試:voryx thruway多次發佈

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

在這裏,我要發佈$計數器值用戶,但該值始終爲5,1.是否有一種方法可以在循環之前打開連接,然後在循環中發佈消息 2.如何從循環訪問$ session-> publish()?

謝謝!

+0

'$ connection-> on('open'...)'只運行一次嗎?我不知道高速公路,但很可能「開放」事件只發射一次。這就是爲什麼你只發送一條消息而不管循環如何。 – marekful

+0

現在我把$ connection-> open();內部循環,它可以根據需要工作,但每次打開連接都可以嗎?一般來說,我有一個deamon,它的運行方式如下:while(true){...}並在那裏發佈消息。 – dave101ua

+0

按照他們的[文檔](https://github.com/voryx/Thruway),似乎您需要註冊並調用遠程過程來發送數據。 ($ session-> register()和$ session-> call()) – marekful

回答

4

有幾種不同的方法可以實現這一點。最簡單的:

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

注意,$循環現在被傳遞到客戶端構造函數中,並且我擺脫了禁用自動重新連接的行(所以如果出現網絡問題,腳本將重新連接)。

+0

感謝您的回答。我嘗試了兩個例子,第一個運行正常,但如果我改變循環while(1),那麼它永遠不會發布消息爲$ client-> start();不叫。與第二個例子相同的東西。如果我按原樣運行它,那麼它不會將消息發佈爲$ client-> start();不叫( – dave101ua