×ðÁú¿­Ê±¹ÙÍøµÇ¼

Laravel¿ª·¢£ºÔõÑùʹÓÃLaravel EchoʵÏÖWebSocketsͨѶ£¿

laravelÊÇÒ»ÖÖÊ¢ÐеÄphp¿ò¼Ü £¬ËüÓÐÐí¶àÓÐÓõŤ¾ßºÍÀ©Õ¹¿â £¬¿ÉÒÔÉÁ¿ª·¢ÕßÇáËɹ¹½¨¸ßÖÊÁ¿µÄwebÓ¦ÓóÌÐò ¡£ÆäÖÐ £¬laravel echoÊÇÒ»¿îÇ¿Ê¢µÄwebsocketsͨѶ¹¤¾ß £¬¿ÉÒÔ×ÊÖú¿ª·¢ÕßÔÚwebÓ¦ÓóÌÐòÖÐʵÏÖʵʱͨѶ ¡£

ÔÚ±¾ÆªÎÄÕÂÖÐ £¬ÎÒÃǽ«ÏÈÈÝÔõÑùʹÓÃLaravel Echo²¢½¨ÉèWebSocketsЧÀÍÆ÷À´ÊµÏÖʵʱͨѶ ¡£ÎÒÃǽ«Ê×ÏȼòÊöʲôÊÇWebSocketsºÍLaravel Echo £¬½Ó×ÅÎÒÃǽ«½â˵ÔõÑù×°ÖúÍÉèÖÃLaravel Echo £¬×îºóÑÝʾÔõÑùʹÓÃLaravel EchoÓëJavaScript¿Í»§¶ËͨѶ ¡£

ʲôÊÇWebSockets£¿

WebSocketsÊÇÒ»ÖÖЭÒé £¬ËüÔÊÐíWebÓ¦ÓóÌÐòºÍWebЧÀÍÆ÷Ö®¼ä½¨ÉèʵʱͨѶÅþÁ¬ ¡£ÕâÖÖÅþÁ¬¿ÉÒÔ¼á³Ö³¤Ê±¼ä¿ªÆô £¬²¢ÇÒÊÇË«ÏòµÄ £¬¿ÉÒÔͬʱ¾ÙÐжÁÈ¡ºÍдÈë ¡£

ÓëHTTPÇëÇó²î±ð £¬WebSocketsÅþÁ¬µÄÒ»Á¬¿ªÆô¿ÉÒÔʹЧÀͶËʵʱµØÍÆËÍÊý¾Ýµ½¿Í»§¶Ë £¬¶ø²»ÐèҪͨ¹ýÂÖѯ»ò³¤ÂÖѯÀ´ÊµÏÖ ¡£ÕâʹµÃWebÓ¦ÓóÌÐòÄܹ»ÊµÏÖ¿ìËÙ¡¢¸ßЧ¡¢ÊµÊ±µÄͨѶ ¡£

ʲôÊÇLaravel Echo£¿

Laravel EchoÊÇLaravel¿ò¼ÜµÄÒ»¿î¹Ù·½À©Õ¹¿â £¬¿ÉÒÔ×ÊÖú¿ª·¢ÕßÔÚWebÓ¦ÓóÌÐòÖÐʵÏÖWebSocketsͨѶ ¡£ËüÌṩÁËÒ»¸ö¼òÆÓµÄAPI £¬¿ÉÒÔʹÓÃJavaScriptÇáËɶ©ÔĹ㲥ƵµÀ £¬²¢ÔÚ¿Í»§¶ËºÍЧÀͶËÖ®¼äת´ïÐÂÎÅ ¡£

ʹÓÃLaravel EchoºÍLaravelÍÆËÍÆ÷¿ÉÒÔÇáËɵؽ¨ÉèWebSocketsЧÀÍÆ÷ £¬²¢Ê¹Óù㲥ƵµÀÀ´×éÖ¯WebSocketsͨѶ ¡£ÔÚ¿Í»§¶Ë £¬ÎÒÃÇ¿ÉÒÔʹÓÃJavaScriptºÍLaravel EchoʵʱµØ¼àÌýÐÂÎÅ £¬ÒÔ±ãÔÚWebÓ¦ÓóÌÐòÖÐʵÏÖʵʱͨѶ ¡£

×°ÖúÍÉèÖÃLaravel Echo

ÔÚ×îÏÈʹÓÃLaravel Echo֮ǰ £¬ÎÒÃÇÐèҪװÖúÍÉèÖÃËùÐèµÄÈí¼þ£ºLaravelºÍpusher PHP SDK ¡£Laravel EchoºÍpusher PHP SDK¿ÉÒÔͨ¹ýComposer°ü¹ÜÀíÆ÷À´×°Öà ¡£

Ê×ÏÈÐèҪװÖÃLaravel£º

composer create-project laravel/laravel your-project-name

µÇ¼ºó¸´ÖÆ

½Ó×Å £¬ÎÒÃÇÐèҪװÖÃpusher PHP SDK ¡£¿ÉÒÔͨ¹ýÔËÐÐÒÔÏÂÏÂÁîÀ´Íê³Épusher PHP SDKµÄ×°Öãº

composer require pusher/pusher-php-server

µÇ¼ºó¸´ÖÆ

ΪÁ˼¯³ÉLaravel EchoºÍpusher PHP SDK £¬ÎÒÃÇÐèÒªÔÚconfig/app.phpÎļþÖÐÌí¼ÓЧÀÍÌṩ³ÌÐòºÍÓÖÃû£º

// config/app.php

'providers' => [
    // ...
    LaravelBroadcastingBroadcastServiceProvider::class,
],

'aliases' => [
    // ...
    'Broadcast' => LaravelBroadcastingBroadcastFacade::class,
],

µÇ¼ºó¸´ÖÆ

½ÓÏÂÀ´ £¬ÈÃÎÒÃÇ×öһЩÉèÖÃÊÂÇé £¬ÒÔÈ·±£Laravel EchoºÍpusher PHP SDKÄܹ»Õý³£ÊÂÇé ¡£ÎÒÃÇÐèÒªÔÚ.envÎļþÖÐÌí¼ÓLaravel EchoºÍpusher PHP SDKËùÐèµÄËùÓÐÉèÖãº

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your-pusher-app-id
PUSHER_APP_KEY=your-pusher-app-key
PUSHER_APP_SECRET=your-pusher-app-secret
PUSHER_APP_CLUSTER=your-pusher-app-cluster

µÇ¼ºó¸´ÖÆ

½¨ÉèWebSocketsЧÀÍÆ÷

½ÓÏÂÀ´ £¬ÎÒÃǽ«Ê¹ÓÃLaravel EchoºÍpusher PHP SDKÀ´½¨ÉèWebSocketsЧÀÍÆ÷ ¡£ÎÒÃÇÐèÒªÔÚroutes/channels.phpÎļþÖнç˵¹ã²¥ÆµµÀ ¡£¹ã²¥ÆµµÀ½«¾öÒéÄÄЩÓû§¿ÉÒÔÎüÊÕµ½¹ã²¥ÐÂÎÅ ¡£

// routes/channels.php

use IlluminateSupportFacadesBroadcast;

Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    // ...
});

µÇ¼ºó¸´ÖÆ

ÔÚÉÏÃæµÄÀý×ÓÖÐ £¬ÎÒÃǽç˵ÁËÒ»¸öÃûΪ¡°chat¡±µÄ¹ã²¥ÆµµÀ £¬²¢¸øËüת´ïÁËÒ»¸ö²ÎÊý¡°roomId¡± ¡£Ö»ÓÐÓµÓС°chat.roomId¡±È¨ÏÞµÄÓû§²Å»ªÎüÊÕµ½¸Ã¹ã²¥ÆµµÀµÄÐÂÎÅ ¡£

½ÓÏÂÀ´ £¬ÎÒÃÇÐèÒª½ç˵¹ã²¥ÊÂÎñºÍÍÆËÍÆäÐÂÎÅ ¡£ÔÚapp/EventsĿ¼Ï½¨ÉèÒ»¸öеÄÊÂÎñÀà £¬ÀýÈ磺

// app/Events/ChatMessageSent.php

<?php

namespace AppEvents;

use IlluminateBroadcastingPrivateChannel;
use IlluminateContractsBroadcastingShouldBroadcast;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;

class ChatMessageSent implements ShouldBroadcast
{
    use Dispatchable, SerializesModels;

    public $message;

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

    public function broadcastOn()
    {
        return new PrivateChannel('chat.' . $this->message['room_id']);
    }
}

µÇ¼ºó¸´ÖÆ

Õâ¸öÊÂÎñÀà°üÀ¨Á˹㲥ÊÂÎñµÄÂß¼­ £¬²¢ÇÒÐèҪʵÏÖShouldBroadcast½Ó̸·æÆø±»¹ã²¥³öÈ¥ ¡£

ÏÖÔÚ £¬ÎÒÃÇ¿ÉÒÔÔÚÓ¦ÓóÌÐòÖÐʵÀý»¯¸ÃÊÂÎñ £¬È»ºó·¢Ë͹㲥ÐÂÎÅ ¡£ÀýÈç £¬ÔÚapp/Http/Controllers/ChatController.phpÎļþÖÐÌí¼ÓÒÔÏÂÐÂÎÅ·¢ËÍÒªÁ죺

// app/Http/Controllers/ChatController.php

<?php

namespace AppHttpControllers;

use AppEventsChatMessageSent;
use IlluminateHttpRequest;

class ChatController extends Controller
{
    public function sendMessage(Request $request)
    {
        $message = [
            'user_id' => $request->user()->id,
            'room_id' => $request->get('room_id'),
            'message' => $request->get('message'),
        ];

        event(new ChatMessageSent($message));

        return response()->json(['status' => 'Message Sent!']);
    }
}

µÇ¼ºó¸´ÖÆ

Çë×¢ÖØ £¬ÉÏÃæµÄ´úÂëÖÐ £¬event(new ChatMessageSent($message))´¥·¢ÁËÊÂÎñ £¬²¢·¢ËÍÁËÒ»¸ö°üÀ¨ÐÂÎÅÊý¾ÝµÄ¹ã²¥ÊÂÎñ ¡£

½¨ÉèʵʱͨѶ

×îºó £¬ÎÒÃÇÐèÒªÔÚJavaScript¿Í»§¶ËÖÐʹÓÃLaravel Echo¼àÌý¹ã²¥ÊÂÎñ £¬ÒÔ»ñȡʵʱµÄWebSocketsͨѶ ¡£ÔÚJavaScriptÖÐ £¬ÎÒÃÇ¿ÉÒÔʹÓÃÁ½ÖÖ·½·¨À´¼àÌý¹ã²¥ÊÂÎñ£º

Echo.channel(channelName).listen(eventName, callback)£º¶©ÔĹ㲥ÊÂÎñ £¬²¢×¢²á»Øµ÷º¯Êý £¬ÒÔ±ãÔÚÎüÊÕµ½ÊÂÎñʱִÐÐ ¡£

Echo.private(channelName).listen(eventName, callback)£º¶©ÔÄ˽Óй㲥ÊÂÎñ £¬²¢×¢²á»Øµ÷º¯Êý £¬ÒÔ±ãÔÚÎüÊÕµ½ÊÂÎñʱִÐÐ ¡£

ÀýÈç £¬ÔÚÎÒÃǵÄ̸ÌìÓ¦ÓóÌÐòÖÐ £¬ÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏ´úÂëÀ´¼àÌýÐÂÐÂÎŵÄÊÂÎñ£º

// resources/js/app.js

import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    encrypted: true,
});

window.Echo.channel(`chat.${roomId}`)
    .listen('ChatMessageSent', (e) => {
        console.log(e);
    });

µÇ¼ºó¸´ÖÆ

ÔÚÉÏÊö´úÂëÖÐ £¬ÎÒÃÇʹÓÃLaravel Echo¿Í»§¶Ë¶©ÔÄ¡°chat.roomId¡±ÆµµÀ £¬²¢ÔÚÎüÊÕµ½¡°ChatMessageSent¡±ÊÂÎñʱ´òӡʧÊÂÎñÊý¾Ý ¡£

½áÂÛ

ͨ¹ýʹÓÃLaravel EchoºÍpusher PHP SDK £¬ÎÒÃÇ¿ÉÒÔÇáËɵؽ¨ÉèWebSocketsЧÀÍÆ÷ £¬²¢Ê¹Óù㲥ƵµÀÀ´ÊµÏÖWebSocketsͨѶ ¡£ÔÚ¿Í»§¶Ë £¬ÎÒÃÇ¿ÉÒÔʹÓÃJavaScriptºÍLaravel EchoʵʱµØ¼àÌýÐÂÎÅ £¬´Ó¶øʵÏÖʵʱͨѶ ¡£

±ðµÄ £¬Laravel Echo»¹ÌṩÁËÐí¶àÆäËû¿ÉÓõĹ㲥ƵµÀºÍÊÂÎñ £¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÃÇÀ´¹¹½¨ÖØ´óµÄWebÓ¦ÓóÌÐò ¡£ÈôÊÇÄãÕýÔÚÑ°ÕÒÒ»ÖÖÏÖ´ú»¯µÄʵʱͨѶ½â¾ö¼Æ»® £¬Laravel EchoºÍpusher PHP SDKÊÇÒ»¸ö²»´íµÄÑ¡Ôñ ¡£

ÒÔÉϾÍÊÇLaravel¿ª·¢£ºÔõÑùʹÓÃLaravel EchoʵÏÖWebSocketsͨѶ£¿µÄÏêϸÄÚÈÝ £¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡

ÃâÔð˵Ã÷£ºÒÔÉÏչʾÄÚÈÝȪԴÓÚÏàÖúýÌå¡¢ÆóÒµ»ú¹¹¡¢ÍøÓÑÌṩ»òÍøÂçÍøÂçÕûÀí £¬°æȨÕùÒéÓë±¾Õ¾ÎÞ¹Ø £¬ÎÄÕÂÉæ¼°¿´·¨Óë¿´·¨²»´ú±í×ðÁú¿­Ê±¹ÙÍøµÇ¼ÂËÓÍ»úÍø¹Ù·½Ì¬¶È £¬Çë¶ÁÕß½ö×ö²Î¿¼ ¡£±¾ÎĽӴýתÔØ £¬×ªÔØÇë˵Ã÷À´ÓÉ ¡£ÈôÄúÒÔΪ±¾ÎÄÇÖÕ¼ÁËÄúµÄ°æȨÐÅÏ¢ £¬»òÄú·¢Ã÷¸ÃÄÚÈÝÓÐÈκÎÉæ¼°ÓÐÎ¥¹«µÂ¡¢Ã°·¸Ö´·¨µÈÎ¥·¨ÐÅÏ¢ £¬ÇëÄúÁ¬Ã¦ÁªÏµ×ðÁú¿­Ê±¹ÙÍøµÇ¼ʵʱÐÞÕý»òɾ³ý ¡£

Ïà¹ØÐÂÎÅ

ÁªÏµ×ðÁú¿­Ê±¹ÙÍøµÇ¼

18523999891

¿É΢ÐÅÔÚÏß×Éѯ

ÊÂÇéʱ¼ä£ºÖÜÒ»ÖÁÖÜÎå £¬9:30-18:30 £¬½ÚãåÈÕÐÝÏ¢

QR code
ÍøÕ¾µØͼ