搭建高性能laravel8+swoole+rabbitmq消息队列+redis集群+mysql主从读写分离

14 篇文章 0 订阅
5 篇文章 0 订阅

一.laravel+swoole

1.laravel8+jwt搭建参考

https://blog.csdn.net/xiayu204575/article/details/111745630
2. 安装laravel-swoole
composer require  swooletw/laravel-swoole
3.发布swoole配置文件到config
php artisan vendor:publish --tag=laravel-swoole
4.修改config/swoole_http.php
[
    'server' => [
        // Options here will pass to Swoole server's configuration directly
        'options' => [
            'max_request' => 1000,
            // You can run your application in deamon
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', false),
            // Normally this value should be 1~4 times lager according to your cpu cores 
            'reactor_num' => env('SWOOLE_HTTP_REACTOR_NUM', swoole_cpu_num() * 2),
            'worker_num' => env('SWOOLE_HTTP_WORKER_NUM', swoole_cpu_num() * 2),
            'task_worker_num' => env('SWOOLE_HTTP_TASK_WORKER_NUM', swoole_cpu_num() * 2),
            // This value should be larger than `post_max_size` and `upload_max_filesize` in `php.ini`.
            // This equals to 10 MB
            'package_max_length' => 10 * 1024 * 1024,
            'buffer_output_size' => 10 * 1024 * 1024,
            // Max buffer size for socket connections
            'socket_buffer_size' => 128 * 1024 * 1024,
            // Worker will restart after processing this number of request
            'max_request' => 3000,
            // Enable coroutine send
            'send_yield' => true,
            // You must add --enable-openssl while compiling Swoole
            'ssl_cert_file' => null,
            'ssl_key_file' => null,
        ],
    ],

    // You can customize your swoole tables here. 
    // See https://wiki.swoole.com/wiki/page/p-table.html for more detailed information.
    'tables' => [
        'table_name' => [
            'size' => 1024,
            'columns' => [
                ['name' => 'column_name', 'type' => Table::TYPE_STRING, 'size' => 1024],
            ]
        ],
    ],
    
   	// ...
	
	*/
    'providers' => [
        Illuminate\Pagination\PaginationServiceProvider::class,

        // 不要移动这两个组件的顺序 解决登录不成功问题
        Illuminate\Auth\AuthServiceProvider::class,
        Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
        Fruitcake\Cors\CorsServiceProvider::class,
    ],
]
5.启动:
#start|stop|restart|reload|infos
php artisan swoole:http start

切记:修改程序后一定要reload一下

6.配置nginx转发到swoole:http
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
server {
    listen 80;
    server_name xxx.xxx.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }
    # any php files must not be accessed
    #location ~* \.php$ {
    #    return 404;
    #}
    # 伪静态设置
    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix ?$query_string;
        }

        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

二.mysql主从读写分离

1.mysql主从读写分离配置

参考

链接: https://blog.csdn.net/xiayu204575/article/details/111056764.

2.laravel配置主从

1)打开config/database.php 找到’mysql’ 修改如下
'mysql' => [
            'read' => [
                'host' => env('DB_READ_HOST', ''),
                'username' => env('DB_READ_USERNAME', ''),
                'password' => env('DB_READ_PASSWORD', '')
            ],
            'write' => [
                'host' => env('DB_WRITE_HOST', ''),
                'username' => env('DB_WRITE_USERNAME', ''),
                'password' => env('DB_WRITE_PASSWORD', '')
            ],
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
//            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
//            'username' => env('DB_USERNAME', 'forge'),
//            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
2)在.env中加入对应的值

三.redis集群

1.redis集群配置

参考

链接: https://blog.csdn.net/xiayu204575/article/details/111059900.

2.laravel配置

1)打开config/database.php 找到’redis’ 修改如下
'redis' => [

        'client' => env('REDIS_CLIENT', 'predis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'clusters' => [
        	//'cluster1'是调用的时候的key  Redis::connection('clusters1');
            'cluster1' => [
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7100,
                    'database' => 0,
                ],
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7101,
                    'database' => 0,
                ],
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7102,
                    'database' => 0,
                ],
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7103,
                    'database' => 0,
                ],
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7104,
                    'database' => 0,
                ],
                [
                    'host' => '127.0.0.1',
                    'password' => '123456',
                    'port' => 7105,
                    'database' => 0,
                ],
            ],
        ],
        
        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],
2)代码中使用
use Illuminate\Support\Facades\Redis;


$redis = Redis::connection('clusters1');
$key = 'foo';
$redis->set($key, 'test');
var_dump($redis->get($key));

默认情况下,集群可以在节点上实现客户端分片,允许你实现节点池以及创建大量可用内存。这里要注意,客户端共享不会处理失败的情况;因此,这个功能主要适用于从另一个主数据库获取的缓存数据。队列用rabbitmq,不用redis集群

四.rabbitmq消息队列

队列用rabbitmq,不用redis集群
参考

https://blog.csdn.net/xiayu204575/article/details/112136791
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用Laravel8和Swoole实现直播,你需要遵循以下步骤: 1. 首先,你需要在Laravel项目中安装Swoole扩展。可以使用Composer运行以下命令来安装它: ``` composer require swooletw/laravel-swoole ``` 2. 在项目的`config/app.php`文件中添加以下行,将Swoole提供程序添加到Laravel中: ``` 'providers' => [ ... SwooleTW\Http\LaravelServiceProvider::class, ... ], 'aliases' => [ ... 'Swoole' => SwooleTW\Http\Facades\Swoole::class, ... ], ``` 3. 创建Swoole服务器的配置文件。可以在项目的根目录下创建`swoole.php`文件,并添加以下内容: ``` return [ 'host' => env('SWOOLE_HOST', '127.0.0.1'), 'port' => env('SWOOLE_PORT', '9501'), 'options' => [ 'worker_num' => 8, 'daemonize' => env('SWOOLE_DAEMONIZE', false), 'task_worker_num' => 8, ], ]; ``` 4. 在`.env`文件中添加以下行,以使用上述配置: ``` SWOOLE_HOST=127.0.0.1 SWOOLE_PORT=9501 SWOOLE_DAEMONIZE=false ``` 5. 创建一个Swoole服务器的启动脚本。在项目的`app/Console/Commands`目录下创建一个`SwooleServer.php`脚本,并添加以下内容: ``` <?php namespace App\Console\Commands; use Illuminate\Console\Command; use SwooleTW\Http\Server\Facades\Server; class SwooleServer extends Command { protected $signature = 'swoole:server {action}'; protected $description = 'Start or stop swoole http server.'; public function handle() { $action = $this->argument('action'); if ($action === 'start') { Server::start(); } elseif ($action === 'stop') { Server::stop(); } else { $this->error('Invalid argument.'); } } } ``` 6. 创建控制器来处理直播流。在项目中创建一个控制器,例如`LiveController.php`,并添加以下内容: ``` <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use SwooleTW\Http\Websocket\Facades\Websocket; class LiveController extends Controller { public function index(Request $request) { return view('live.index'); } public function handle(Request $request) { // 处理直播流 Websocket::broadcast()->emit('live', $request->getContent()); } } ``` 7. 创建一个WebSocket事件监听器。在项目的`app/Providers`目录下创建一个`WebsocketServiceProvider.php`文件,并添加以下内容: ``` <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use SwooleTW\Http\Websocket\Server; use App\Events\LiveStream; class WebsocketServiceProvider extends ServiceProvider { public function boot(Server $server) { $server->on('message', function ($server, $frame) { $payload = json_decode($frame->data, true); if ($payload['event'] === 'live') { event(new LiveStream($payload['data'])); } }); } } ``` 8. 创建一个事件类来处理直播流。在项目中创建一个事件类,例如`LiveStream.php`,并添加以下内容: ``` <?php namespace App\Events; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class LiveStream { use Dispatchable, InteractsWithSockets, SerializesModels; public $stream; public function __construct($stream) { $this->stream = $stream; } public function broadcastOn() { return ['live']; } } ``` 9. 创建一个事件监听器来推送直播流。在项目的`app/Listeners`目录下创建一个`LiveStreamListener.php`文件,并添加以下内容: ``` <?php namespace App\Listeners; use App\Events\LiveStream; use SwooleTW\Http\Websocket\Facades\Websocket; class LiveStreamListener { public function handle(LiveStream $event) { Websocket::broadcast()->emit('live', $event->stream); } } ``` 10. 在`EventServiceProvider.php`中注册事件和监听器。在项目的`app/Providers`目录下找到`EventServiceProvider.php`文件,并将以下行添加到`$listen`数组中: ``` 'App\Events\LiveStream' => [ 'App\Listeners\LiveStreamListener', ], ``` 11. 创建一个前端页面来显示直播流。在项目的`resources/views`目录下创建一个`live/index.blade.php`文件,并添加以下内容: ``` <!DOCTYPE html> <html> <head> <title>Live Stream</title> <meta name="csrf-token" content="{{ csrf_token() }}"> </head> <body> <div id="live"></div> <script src="{{ asset('js/app.js') }}"></script> <script> const ws = new WebSocket('ws://localhost:9501'); ws.onmessage = function (event) { const data = JSON.parse(event.data); if (data.event === 'live') { document.getElementById('live').innerHTML = data.data; } }; </script> </body> </html> ``` 现在你已经完成了Laravel8和Swoole的配置,可以使用以上步骤来实现直播功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值