Laravel は swoole を使用して WebSocket リンクを構築します

オプション 1 Composer のインストール構成 LaravelS 拡張パッケージをインストールします。

composer require hhxsv5/laravel-s

Laravel 5.5以降が利用可能です。 config/app.php 設定ファイルに手動で登録する必要はありません。Artisanコマンドを実行して、対応するスクリプトと設定ファイルをルートディレクトリに公開します。

php artisan laravels publish

このコマンドは、構成ファイルを ディレクトリlaravels.php に 公開しconfig 、スクリプト ファイルを bin ディレクトリに公開します。

構成ファイルで Swoole のいくつかの基本的な構成を実行できます。スクリプト ファイルは主に、Swoole サービスの起動、リロード、シャットダウンなどの操作を管理するために使用されます。

LaravelSを始める

//命令启动 LaravelS 
php bin/laravels start 

このようにして、Swoole サービスが開始され、ローカル ポート 5200 をリッスンします。リクエストがこのポートに送信されると、処理できます。

さらに php bin/laravels 、LaravelS を管理するために他のコマンドもサポートされています。

解決策 2 pecl コマンドのインストールでは、最初に pecl をインストールする必要があります

  php swoole拡張機能のインストール

pecl install swoole

php.ini設定ファイルを変更する

extension=swoole.so

php-fpmを再起動します。システムコマンドが異なると異なります。

sudo service php-fpm start      # 启动php-fpm

swoole拡張機能がインストールされていることを確認してください

php -m

laravelw/laravel-swooleをインストールする

Composer を使用してプロジェクトのルート ディレクトリにインストールします

composer require swooletw/laravel-swoole -vvv 

-vvv パラメータを追加することをお勧めします。インストールが非常に遅く、インストールしないと所有者が行き詰まっているような印象を与えるからです。ローカルまたは PHPstorm で実行しないことをお勧めします。Windows は laravel-swoole をサポートしていないため、さまざまな問題が発生します。インストールは仮想マシンのプロジェクト ルート ディレクトリで実行できるため、忍耐が必要です。Composer.josn に下図のロゴが表示されれば、インストールは成功です。

Swoole をインストールしたら、サーバー側のコードを書くことになります。php ファイル websocket.php を自分で書くことができます

コードは以下のように表示されます。

<?php
ignore_user_abort(); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
 
//创建一个websocket服务器
$ws_server = new swoole_websocket_server('0.0.0.0', 9501);
 
//创建一个用于存储的redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
 
$ws_server->on('open', function ($ws, $request) use ($redis) {
    $redis->sAdd('id', $request->fd);
    $mes = '用户:'.$request->fd.'已加入聊天室';
    $redis->sAdd('mes', $mes);
    pushAll($redis,$ws,$mes);
    getAllMes($redis,$ws);
});
 
$ws_server->on('message', function ($ws, $frame) use ($redis) {
    $mes = '用户:'.$frame->fd.'<br/>'.$frame->data;
    pushAll($redis,$ws,$mes);
});
 
//监听WebSocket连接关闭事件
$ws_server->on('close', function ($ws, $fd) use ($redis) {
        $redis->srem('key:'.$id,$fd);
    $mes = '用户:'.$fd.'已退出聊天室';
    $redis->sAdd('mes', $mes);
    pushAll($redis,$ws,$mes);
});
 
$ws_server->start();
 
/**
 * 登录时获取以前的消息
 */
function getAllMes($redis,$ws){
    $mesLists = $redis->sMembers('mes');
    foreach ($mesLists as $mes){
        pushAll($redis,$ws,$mes);
    }
}
/**
 * 给所有用户发信息
 */
function pushAll($redis,$ws,$mes){
    $fds = $redis->sMembers('id');
    foreach ($fds as $fd){
            if($ws->exist($fd)){
                    $ws->push($fd,$mes);
            }
    }
}

その後、Linuxが実行されます

php webcoket.php

上記はメソッドですが、次のような自動読み込みメソッドを書くこともできます。

Laravel独自のメソッドArtisanを使用する

php artisan make:command Swoole

Swoole ファイルは app\Console\Command\ ディレクトリに生成されます

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use swoole_websocket_server;

class Swoole extends Command
{

    protected $signature = 'swoole {action}';
    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }
    /**
     * Execute the console command.
     * 这个方法中的逻辑需要自己写
     * @return mixed
     */
    public function handle()
    {
        $action = $this->argument('action');
        switch ($action) { //方法可以自己写调用
            case 'close':
                break;
            default:
                $this->start();
                break;
        }
    }
    public function start()
    {
        // 这里是监听的服务端口号
        $this->ws = new swoole_websocket_server("0.0.0.0", 9500);
        //监听WebSocket连接打开事件
        $this->ws->on('open', function ($ws, $request) {
             $this->ws->push($request->fd, "is ok\n"); //链接服务器成功返回提示
        });
        //监听WebSocket消息事件
        $this->ws->on('message', function ($ws, $frame) {
            $this->info("client is SendMessage\n" . $frame);
        });
        //监听WebSocket主动推送消息事件
        $this->ws->on('request', function ($request, $response) {
            $scene = $request->post['scene'];
            foreach ($this->ws->connections as $fd) {
                if ($this->ws->isEstablished($fd)) {
                    $this->ws->push($fd, $scene);
                }
            }
        });
        //监听WebSocket连接关闭事件
        $this->ws->on('close', function ($ws, $fd) {
            $this->info("client is close\n");
        });
        $this->ws->start();
    }
}

この Swoole クラスを Kernel.php ファイルに登録します

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{

    protected $commands = [
        \App\Console\Commands\Swoole::class,
    ];
    protected function schedule(Schedule $schedule)
    {
    }
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
        require base_path('routes/console.php');
    }
}

仮想マシンのルートディレクトリで実行

 php artisan swoole start

ここでサーバーとバックエンドのコードを完成させるための長期的なプロセスが開始されます。長いリンクを実現するにはフロントエンド ページが必要です。

フロントエンドのコードは非常にシンプルです

<!doctype html>
<html>
<head>
    <title>测试WebSocket</title>
</head>
    <div id="WebSocket"></div>
<body>
    <script>
    var ws = new WebSocket("ws://ip:9500");
    ws.onopen = function(event) {
        console.log("客户端已连接上!");
        ws.send("hello server,this is client!"); //客户端给服务端推送消息
    };
    ws.onmessage = function(event) {
        var parent = document.getElementById('WebSocket');
        var div = document.createElement("div");
        div.innerHTML = event.data
        parent.appendChild(div);
        console.log("服务器传过来的数据是:" + event.data);
    }
    ws.onclose = function(event) {
        console.log("连接已关闭");
    };
    </script>
</body>

おすすめ

転載: blog.csdn.net/weixin_43695488/article/details/126134521