2013-09-23 57 views
27

我得到了一個在Laravel 4中編寫的web應用程序。這個應用程序使用棘輪,更具體地說,它使用包Latchet。一點題外話,我使用了以下技術:使用websockets的最佳實踐?

現在,我得到了以下方案:

  • 我有一個幻燈片即應通過websocket接收更新。
  • 整個應用程序已經建立,我可以通過ZeroMq發佈從PHP到我的websocket客戶端的新代碼更改。
  • 在我的routes.php文件,我有以下的代碼,從而使主題正確註冊:

    //routes.php 
    // Setup a connection and register a topic where clients can connect to. 
    Latchet::connection('Connection'); 
    Latchet::topic('PhotoStream/{client}', 'PhotoStreamController'); 
    
  • 然後,我開始棘輪服務器。

sudo php artisan latchet:listen

如果照片被上傳,然後我可以運行下面的代碼來推送更新到客戶端都是聽我演講的題目(PhotoStream/client1在這種情況下):

// Create the object, save it to db and then publish it to my websockets 
$photo = new Photo; 
$photo->location = 'path/to/file'; 
$photo->save(); 
// Publish it through my websocket clients. (push from server). 
Latchet::publish('PhotoStream/client1', array('msg' => $photo->toArray())); 

該代碼全部有效,但在更新的情況下。我的問題如下:

我該如何處理客戶端的初始化?

  1. 我應該先用普通的舊PHP渲染頁面,然後初始化我的websocket客戶端,然後接收進一步的更新(如果有的話)?
  2. 或者我應該在註冊一個新的websocket客戶端時,爲請求提供一個額外的參數,以便服務器通過websockets向我發送完整的數據?

這兩個選項中的後者似乎是對我來說最好的選擇,但我真的不知道如何以良好的方式實現這一點。

+0

我希望你有更多的答覆。我開始用laravel實現websockets;我知道一點,但我的搜索仍在繼續。 –

+0

絕對讓我更新! –

+0

那麼,絕對不要使用BrainSockets。他們說他們在1.0版本,但是服務器無法推送。當我嘗試另一個套接字插件時,我會再回來查看。 –

回答

5

在JavaScript端(檢索初始列表):

//session.subscribe(....) 

session.call('route/to/controller', arg1, arg2).then(function(res) { 
    console.log(res) //initial collection of photos 
}); 

在PHP端(檢索初始列表):

public function call($connection, $id, $topic, $params) { 
    //the id is needed to be able to trace your async calls back to the right promise 
    $connection->callResult($id, $this->getInitialPhotosFilteredByParams($params)); 
}); 

既然你已經成功地得到通過訂閱更新,這是你需要的全部。注意xss雖然,params可能不會過濾。

0

如果以正確的方式理解你的問題,你可以這樣做:你想知道如果通過websocket發送圖像是一個好主意,如果這些圖像也可以從PHP預加載。

我建議你使用PHP預裝圖像而不使用websocket,並且一旦添加新圖像就會開始使用套接字。

這樣用戶應該可以在頁面加載的那一刻看到圖像,並且不需要等待websocket連接建立。

如果您更喜歡通過套接字進行加載,我仍然建議您從滑塊中加載前幾個圖像,這些圖像可以立即從PHP中看到。否則,用戶將不得不等待更長的時間(注意多,但明顯更長)。