2016-11-28 9 views
5

प्रश्न शीर्षक थोड़ा भ्रमित हो सकता है, मैंने इसे समझाने के लिए अपनी पूरी कोशिश की।एनवी प्रसारण के लिए लारवेल इको दोहराने की सुनवाई घटना

मुझे laravel-echo-server, redis (क्यूइंग के लिए), और Laravel echo सेट अप मिला है। मैं चाहता हूं कि एक इनपुट के माध्यम से एक संदेश भेजना, और पृष्ठ पर सभी के लिए संदेश फ़ीड अपडेट करना; अनिवार्य रूप से एक चैट रूम।

सबकुछ काम करता है, तथ्य यह है कि यह नरक के रूप में धीमा है, लेकिन मैं Laravel Echo और Vue पर नया हूं।

अगर मैंने एक संदेश भेजा है, तो यह ठीक है, लेकिन फिर जब मैं एक और संदेश भेजता हूं तो मुझे दो प्रतिक्रियाएं मिलती हैं। तीसरे संदेश को तीन प्रतिक्रियाएं भेजें और इसी तरह ...

मैं वास्तव में क्या गलत कर रहा हूं? मैंने socket.io/laravel-echo-server केवल एक बार चैनल से कनेक्ट किया है, और मेरा broadcast केवल एक बार भेजा जा रहा है (चेक कतार कार्यकर्ता यह केवल अनुरोध को संसाधित कर रहा है), तो इसे तेजी से दोहराया जा रहा है?

यह मेरा app.js है:

const chatWindow = new Vue({ 
    el: '#chatWindow', 
    data: { 
     messages: [] 
    }, 
    methods: { 
     sendMessage: function() { 
      this.$http.post('/chat', {message: this.message}).then((response) => { 
       window.Echo.channel('test-chat-channel') 
        .listen('MessageSent', (event) => { 
         console.log(event.message); 
         // this.messages.push(event.message); 
        }); 
      }, (response) => { 
       // error callback 
      }); 

      this.message = ''; 
     } 
    }, 
    props: ['message'] 
}); 

यह मेरा चैट दृश्य है:

<div id="chatWindow" class="col-sm-7"> 
    <h1 class="text-center no-top">Chat</h1> 
    <div class="chat-window"> 
     <ul> 
      <li v-for="message in messages">@{{ message }}</li> 
     </ul> 

     <div class="form-group"> 
      <input title="Send Message" v-model="message" @keyup.enter="sendMessage" class="form-control" placeholder="Send message..."> 
     </div> 
    </div> 
</div> 

बस मामले में वे यहाँ प्रासंगिक होते हैं मेरी मार्ग है:

Route::post('/chat', function (Request $request) { 
    event(new MessageSent($request->message)); 
}); 
,210

और मेरे घटना:

<?php 

namespace App\Events; 

use Illuminate\Broadcasting\Channel; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Broadcasting\PrivateChannel; 
use Illuminate\Broadcasting\PresenceChannel; 
use Illuminate\Broadcasting\InteractsWithSockets; 
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 

class MessageSent implements ShouldBroadcast 
{ 
    use InteractsWithSockets, SerializesModels; 

    public $message; 

    public function __construct($message) 
    { 
     $this->message = $message; 
    } 

    public function broadcastOn() 
    { 
     return new Channel('test-chat-channel'); 
    } 
} 

उत्तर

2

मैं आवेदन मैं वर्तमान में निर्माण कर रहा हूँ में Redis पबसब उपयोग कर रहा हूँ और एक ही समस्या से लड़ने के लिए किया है। जबकि मैं आपको विशेष रूप से इसे ठीक करने के बारे में सलाह देने के लिए लार्वेल-इको-सर्वर नहीं जानता, मैं इस लक्षण के संभावित कारण का वर्णन कर सकता हूं।

आपकी कॉन्फ़िगरेशन प्रत्येक चक्र पर रेडिस चैनल की सदस्यता ले रही है, और यह सदस्यता क्षणिक नहीं है। प्रत्येक बार जब आप सब्सक्राइब करते हैं, तो आप एक नया श्रोता बनाते हैं। प्रत्येक बार जब आप प्रकाशित करते हैं, रेडिस सभी श्रोताओं/ग्राहकों को संदेश भेजता है। यदि एक ग्राहक ने तीन बार सदस्यता ली है, तो वह उस संदेश को तीन बार प्राप्त करेगा। आपको या तो यह पहचानने की आवश्यकता है कि आपने सदस्यता ली है और इसे डुप्लिकेट नहीं किया है, या आपको प्रत्येक चक्र के बाद सदस्यता समाप्त करने की आवश्यकता है।

ध्यान देने योग्य एक बात यह है कि रेडिस इंस्टेंस या तो प्रकाशित या सब्सक्राइब करना चाहिए, लेकिन दोनों नहीं। लार्वेल-इको-सर्वर शायद आपके लिए इसे संभाला जा रहा है।

रेडिस आम तौर पर प्रत्येक प्रकाशित पर एक संदेश प्राप्त करने वाले ग्राहकों की संख्या देता है। इससे मुझे समस्या का निदान करने में मदद मिली, खासकर जब से मैं निजी चैनल चला रहा हूं और प्रत्येक संदेश के लिए 1, और केवल 1, श्रोता होना चाहिए। रेडिस में "numsub" कमांड भी है जो एक चैनल पर श्रोताओं की संख्या देता है।

मैंने देखा कि आपका प्रेषण समारोह फ़ंक्शन विधि का उपयोग करता है। यह अंधेरे में एक शॉट है, लेकिन क्या आपको कई सब्सक्रिप्शन मिलते हैं?

किसी भी तरह से, यदि आपके पास एक विशिष्ट प्रश्न है जिसका उत्तर मैं दे सकता हूं तो मुझे और मदद करने में खुशी होगी।

+0

मुझे लगता है कि आप यहां कुछ हो सकते हैं। मुझे लगता है कि मुझे क्या करना चाहिए, श्रवण विधि को अलग करना है, और सफल अनुरोध के लिए प्रतिक्रिया कॉलबैक में नहीं है ... शायद यह समस्या का कारण बन रहा है - मुझे वास्तव में प्रतिक्रिया कॉलबैक की आवश्यकता नहीं है, केवल एक त्रुटि कॉलबैक है, और सदस्यता से बचने के अनुरोध के बाहर घटना को सुनने के लिए। इसके लिए धन्यवाद, मैं इसे एक शॉट दूंगा और आपको बता दूंगा! –

+0

@ ए। एप्पलबी यह भी मेरे लिए संभावित लग रहा है। –

+0

@ ए। एप्पलबी यह कैसा चल रहा है? क्या आप इसे हल कर चुके थे? क्या मैं मदद कर सकता हूँ? –

संबंधित मुद्दे