Maison >développement back-end >tutoriel php >Configuration de la réverbération dans Laravel avec Apache

Configuration de la réverbération dans Laravel avec Apache

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 07:33:10199parcourir

Configuring Reverb in Laravel with Apache

Reverb est une alternative pratique à Pusher pour la diffusion d'événements en temps réel dans Laravel. Ce guide se concentre sur la configuration de Reverb dans Laravel 11 pour un système de production en direct hébergé derrière Cloudflare avec Flexible SSL.

Conditions préalables

Avant de vous lancer dans la configuration, assurez-vous d'avoir les éléments suivants :

  1. Laravel 11 installé : Vous pouvez configurer une nouvelle application Laravel 11 à l'aide de Composer.
  2. Serveur Web Apache : assurez-vous qu'Apache est installé et en cours d'exécution.
  3. Compte Cloudflare : votre application doit être configurée derrière Cloudflare avec Flexible SSL activé.

Installer la réverbération

Pour commencer, vous devez installer Reverb dans votre projet Laravel. Exécutez la commande Composer suivante :

composer require laravel/reverb

Après l'installation, publiez le fichier de configuration :

php artisan vendor:publish --provider="Laravel\Reverb\ReverbServiceProvider"

Cela créera un fichier config/reverb.php dans lequel vous pourrez ajuster les paramètres de Reverb.

Exemple de configuration de réverbération

Ce qui suit est un exemple de configuration pour Reverb :

<?php

return [

    'default' => env('REVERB_SERVER', 'reverb'),

    'servers' => [

        'reverb' => [
            'host' => env('REVERB_HOST', '0.0.0.0'),
            'port' => env('REVERB_PORT', 6001),
            'hostname' => env('REVERB_HOST'),
            'options' => [
                'tls' => [],
            ],
            'max_request_size' => env('REVERB_MAX_REQUEST_SIZE', 10_000),
            'scaling' => [
                'enabled' => env('REVERB_SCALING_ENABLED', false),
                'channel' => env('REVERB_SCALING_CHANNEL', 'reverb'),
                'server' => [
                    'url' => env('REDIS_URL'),
                    'host' => env('REDIS_HOST', '127.0.0.1'),
                    'port' => env('REDIS_PORT', '6379'),
                    'username' => env('REDIS_USERNAME'),
                    'password' => env('REDIS_PASSWORD'),
                    'database' => env('REDIS_DB', '0'),
                ],
            ],
            'pulse_ingest_interval' => env('REVERB_PULSE_INGEST_INTERVAL', 15),
            'telescope_ingest_interval' => env('REVERB_TELESCOPE_INGEST_INTERVAL', 15),
        ],

    ],

    'apps' => [

        'provider' => 'config',

        'apps' => [
            [
                'key' => env('REVERB_APP_KEY'),
                'secret' => env('REVERB_APP_SECRET'),
                'app_id' => env('REVERB_APP_ID'),
                'options' => [
                    'host' => env('REVERB_HOST'),
                    'port' => env('REVERB_PORT', 443),
                    'scheme' => env('REVERB_SCHEME', 'https'),
                    'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
                ],
                'allowed_origins' => ['*'],
                'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
                'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
                'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
            ],
        ],

    ],

];

Paramètres .env

Assurez-vous que les variables d'environnement suivantes sont correctement configurées dans votre fichier .env :

BROADCAST_CONNECTION=reverb 
QUEUE_CONNECTION=database

REVERB_HOST=127.0.0.1 
REVERB_PORT=6001
REVERB_APP_ID=<app-key>
REVERB_APP_KEY=<app-key>
REVERB_APP_SECRET=<app-secret>
REVERB_SCHEME=http

VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="example.com"
VITE_REVERB_PORT=443
VITE_REVERB_SCHEME=https 

Créer un événement

Utilisez la commande Artisan suivante pour générer une nouvelle classe d'événement :

php artisan make:event MessageSent

Voici un exemple d'implémentation de l'événement MessageSent :

<?php

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\Channel;

class MessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

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

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

    public function broadcastAs(): string
    {
        return 'message-sent';
    }
}

Exemple de lame Laravel

Créez un modèle Blade simple pour tester la fonctionnalité Reverb (welcome.blade.php) :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>Laravel Reverb WebSocket Test</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pusher/8.3.0/pusher.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/laravel-echo/1.17.1/echo.iife.min.js"></script>
</head>
<body>
    <h1>Laravel Reverb WebSocket Test</h1>
    <p>Open the console to see WebSocket messages.</p>
    <button>



<h2>
  
  
  Defining Routes
</h2>

<p>Below is the code to define the required routes:<br>
</p>

<pre class="brush:php;toolbar:false"><?php

use Illuminate\Support\Facades\Route;
use App\Events\MessageSent;

Route::post('/send-message', function (\Illuminate\Http\Request $request) {

    event(new MessageSent($request->input('message')));

    return response()->json(['success' => true]);

});

Route::get('/', function () { return view('welcome'); });

Configuration d'Apache

Exécutez les commandes suivantes pour activer les modules Apache nécessaires :

sudo a2enmod proxy
sudo a2enmod proxy_wstunnel 
sudo a2enmod rewrite

Vous trouverez ci-dessous un exemple de configuration pour votre configuration Apache VirtualHost :

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    DocumentRoot /var/www/example.com/public

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass /app ws://127.0.0.1:6001/app
    ProxyPassReverse /app ws://127.0.0.1:6001/app

    SetEnvIf X-Forwarded-Proto https HTTPS=on

    ErrorLog /var/www/logs/example.com_error.log
    CustomLog /var/www/logs/example.com_access.log combined
</VirtualHost>

<Directory /var/www/example.com>
    Options -Indexes +FollowSymLinks -MultiViews
    AllowOverride All
    Require all granted
</Directory>

Services en cours d'exécution

Pour démarrer les services, vous devrez lancer le gestionnaire d'événements et le serveur Rebel.
Exécutez la commande suivante pour lancer le gestionnaire d'événements :

php artisan queue:work

Utilisez la commande ci-dessous pour démarrer le serveur Rebel sur le port et l'hôte spécifiés :

php artisan reverb:start --port=6001 --host=0.0.0.0

Conclusion

Si vous n'utilisez pas le CDN pour Laravel Echo et Pusher, vous devrez installer les bibliothèques npm requises (pusher-js et laravel-echo) pour intégrer la diffusion d'événements en temps réel dans votre application. Cette configuration nécessite un processus de construction frontend pour gérer et regrouper les bibliothèques au sein de votre projet.

Pour les applications hébergées derrière Cloudflare avec Full SSL, un VirtualHost distinct doit être configuré avec des certificats SSL correctement définis. Cela garantit une communication WebSocket sécurisée et évite les problèmes de non-concordance SSL/TLS, qui peuvent empêcher les connexions WebSocket de fonctionner correctement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn