huang-yi/laravel-swoole-http

此包已弃用,不再维护。作者建议使用 huang-yi/shadowfax 包。

基于 Swoole 的高性能 HTTP/WebSocket 服务器。加速您的 Laravel 和 Lumen 应用程序。

v3.1.4 2019-03-12 02:12 UTC

This package is auto-updated.

Last update: 2020-05-08 13:22:08 UTC


README

License Build Status

基于 Swoole 的高性能 HTTP 服务器。现在,它也支持 WebSocket 服务器

翻译

要求

  • Laravel/Lumen 5.2+
  • ext-swoole 1.9.5+
  • ext-inotify (可选)

安装与设置

  1. 此包可以通过 composer 安装
$ composer require huang-yi/laravel-swoole-http
  1. 注册服务提供者(可选)

如果您的 Laravel 版本低于 5.5 或您正在使用 Lumen,则需要手动注册服务提供者

<?php
// Framework: Laravel
// File: config/app.php

[
    'providers' => [
        HuangYi\Swoole\SwooleServiceProvider::class,
    ],
];
<?php
// Framework: Lumen
// File: bootstrap/app.php

$app->register(HuangYi\Swoole\SwooleServiceProvider::class);
  1. 配置

运行此命令以发布配置文件

$ php artisan vendor:publish --provider="HuangYi\Swoole\SwooleServiceProvider"

点击此处获取有关 配置 的更多信息。

  1. 启动服务器

运行此命令以启动服务器

php artisan swoole:server

然后,您可以通过 http://127.0.0.1:1215 访问您的网站。

点击此处获取有关 命令 的更多信息。

配置

驱动

此选项控制创建服务器时使用的默认 "驱动"。

支持的: "http","websocket"

主机

服务器的 IP 地址。

端口

服务器的端口。

选项

Swoole 服务器的配置。更多信息请参阅 官方文档

注意:如果您使用 task,则 task_worker_num 的值必须大于 0。

重置

此选项控制每个请求后需要重置的实例。这有助于开发人员避免由单例引起的诸如 auth 之类的问题。

消息解析器

WebSocket 消息解析器。您可以替换此选项为自定义解析器。

注意:自定义解析器必须实现 HuangYi\Swoole\Contracts\ParserContract

Redis

  • connection:指定一个 Redis 连接以存储 WebSocket 房间和客户端。
  • prefix:设置 Redis 键的前缀。

表格

定义swoole表结构

<?php

[
    'tables' => [
        [
            'name' => 'users',
            'size' => 1024,
            'columns' => [
                ['id', 'int', 8],
                ['nickname', 'string', 255],
                ['score', 'float']
            ],
        ],
    ],
];
  • name:指定表名。
  • size:定义最大行数。
  • columns:定义表的列。格式:[列名列类型列长度]。列类型:intintegerstringvarcharcharfloat

点击此处了解更多关于的信息。

watcher

文件监视配置。

directories:定义正在监视的目录列表;

excluded_directories:定义不监视的目录列表;

suffixes:定义正在监视的文件后缀列表。

命令

此包提供了一个 artisan 命令来管理 swoole 服务器。

php artisan swoole:server

此命令有一个 "action" 参数,默认值为 "start"。

操作 描述
start 启动 swoole 服务器。
stop 停止 swoole 服务器。
reload 重新加载 swoole 服务器。
restart 重新启动 swoole 服务器。
watch 进入监视模式。当监视的文件发生变化时,swoole 服务器将自动重新加载。

注意:swoole 服务器只能在 cli 环境下运行。

Swoole Table 可以帮助开发者在工作进程之间共享数据。您可以在配置文件中定义表结构。

<?php
use HuangYi\Swoole\Facades\Table;

// Insert a record.
Table::use('users')->set(1, ['id' => 1, 'nickname' => 'Bob', 'score' => 9.5]);

// Query a record.
$bob = Table::use('users')->get(1);
$nickname = Table::use('users')->get(1, 'nickname');

// Truncate a table.
Table::truncate('users');

点击此处了解更多关于Swoole 表的信息。

任务

定义一个任务

<?php

use HuangYi\Swoole\Contracts\TaskContract;
use Illuminate\Support\Facades\Mail;

class SendMailTask implements TaskContract
{
    /**
     * @var array $mail
     */
    protected $mail;

    /**
     * Mail task
     * 
     * @var array $mail
     * @return void
     */
    public function __construct(array $mail)
    {
        $this->mail = $mail;
    }

    /**
     * Task handler.
     *
     * @param \Swoole\Server $server
     * @param int $taskId
     * @param int $srcWorkerId
     * @return void
     */
    public function handle($server, $taskId, $srcWorkerId)
    {
        Mail::to($this->mail['to'])->send($this->mail['view'], $this->mail['data']);
    }
}

将任务发送到任务工作进程

<?php

$task = new SendMailTask([
    'to' => 'bob@mail.com',
    'view' => 'mail',
    'data' => [],
]);

app('swoole.server')->task($task);

注意:要启动任务工作进程,必须将 task_worker_num 的值设置为大于 0。

Nginx

server {
    listen 80;
    server_name your.domain;
    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;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";
        
        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

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

注意:将 swoole 服务器(默认为 127.0.0.1)的 IP 地址添加到中间件 App\Http\Middleware\TrustProxies

提示

  • 请勿使用以下函数:sleep()exit()die()
  • 注意单例。