跳到主要内容

高性能服务 Swoole

XinAdmin 基于 Laravel 的生态,可以直接使用 Swoole 来作为你应用程序的服务器 详情请查看Laravel 文档。它具有以下优势:

  • 提供高性能的 Http 请求。
  • 超高的并发处理能力。
  • 定时器

Laravel Octane通过使用高性能应用程序服务器 Swoole 启动您的应用程序一次,将其保存在内存中,然后以超音速馈送请求,在本章节中我们介绍如何使用Swoole来提高应用的性能。

注意

Swoole 不支持在 windows 系统下运行,建议你在本地搭建虚拟环境作为本地开发环境,我们建议使用 Linux 系统作为你的服务器。

准备

安装 Swoole

在开始前,您必须安装 Swoole 扩展。 通常,这可以通过 PECL 完成:

pecl install swoole

安装 Octane

Octane 可以通过 Composer 包管理器安装:

composer require laravel/octane

安装完成后,您可以执行 Artisan octane:install 命令,该命令会将 Octane 的配置文件安装到您的应用程序中:

php artisan octane:install

安装的时候选择 Swoole 来作为你的服务器。安装完成后,默认会在 .env 文件中添加以下配置:

OCTANE_SERVER=swoole

Swoole Serve

基于 Laravel 的 Octane,你可以使用 Swoole 作为你的服务器。 在生产环境中,您应该在传统的 Web 服务器(如 Nginx 或 Apache)中包含下面配置。 这样做将允许 Web 服务器提供静态资产(如图像和样式表),并管理 SSL 证书终止。

在下面的 Nginx 配置示例中,Nginx 将向运行在端口 8000 上的 Octane 服务器提供站点的静态资产和代理请求:

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
listen [::]:80;
server_name domain.com;
server_tokens off;
root /home/forge/domain.com/public;

index index.php;

charset utf-8;

location /index.php {
try_files /not_exists @octane;
}

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

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

access_log off;
error_log /var/log/nginx/domain.com-error.log error;

error_page 404 /index.php;

location @octane {
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;

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

监听文件更改

由于您的 Application 在 Octane 服务器启动时被加载到内存中一次,因此当您刷新浏览器时,对 App 文件的任何更改都不会反映出来。 例如,在重新启动服务器之前,添加到文件中的路由定义不会反映出来。为方便起见,您可以使用该标志指示 Octane 在应用程序内发生任何文件更改时自动重启服务器:routes/web.php--watch

php artisan octane:start --watch

指定 worker 计数

默认情况下,Octane 将为机器提供的每个 CPU 内核启动一个应用程序请求工作程序。然后,这些工作程序将用于在传入的 HTTP 请求进入您的应用程序时为其提供服务。您可以在调用命令时手动指定要开始使用该选项的 worker 数量:--workersoctane:start

php artisan octane:start --workers=4

您还可以指定多少个“任务工作者”您希望开始:

php artisan octane:start --workers=4 --task-workers=6

指定最大请求量

为了帮助防止杂散内存泄漏,Octane 会在处理完 500 个请求后正常重启任何 worker。要调整此数字,您可以使用以下选项:--max-requests

php artisan octane:start --max-requests=250

并发任务

您可以通过轻量级后台任务并发执行并发任务。使用 Octaneconcurrently 方法完成此作。您可以将此方法与 PHP 数组解构结合使用,以检索每个作的结果 :

use App\Models\User;
use App\Models\Server;
use Laravel\Octane\Facades\Octane;

[$users, $servers] = Octane::concurrently([
fn () => User::all(),
fn () => Server::all(),
]);

Octane 处理的并发任务利用 Swoole 的“任务工作者”,并在与传入请求完全不同的进程中执行。可用于处理并发任务的工作线程数量由命令上的指令决定:--task-workersoctane:start

php artisan octane:start --workers=4 --task-workers=6

调用该方法时,由于 Swoole 任务系统施加的限制,您不应提供超过 1024 个任务。

定时器

Octane 提供了一个 tick 方法,该方法允许您注册一个回调,该回调在指定的秒数后执行一次。提供给方法的第一个参数应该是表示滚动条名称的字符串。第二个参数应该是将按指定间隔调用的可调用对象。

在此示例中,我们将注册一个每 10 秒调用一次的闭包。通常,应该在应用程序的某个服务提供商的boot方法中调用该方法:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))
->seconds(10);

使用 immediate 方法,您可以指示 OctaneOctane 服务器最初启动时立即调用 tick 回调,此后每 N 秒调用一次:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))
->seconds(10)
->immediate();

高性能缓存

您可以利用 Octane 缓存驱动程序,该驱动程序提供高达每秒 200 万次作的读写速度。因此,对于需要从缓存层获得极高读/写速度的应用程序,此缓存驱动程序是一个很好的选择。

此缓存驱动程序由Swoole table提供,缓存中存储的所有数据都可供服务器上的所有工作程序使用。但是,当服务器重新启动时,缓存的数据将被刷新:

Cache::store('octane')->put('framework', 'Laravel', 30);

缓存间隔

除了 Laravel 缓存系统提供的典型方法外,Octane 缓存驱动程序还具有基于定时器的缓存功能。这些缓存将按指定的时间自动刷新,你应该在应用程序的某个服务提供商的boot方法中注册使用。例如,以下缓存将每 5 秒刷新一次:

use Illuminate\Support\Str;

Cache::store('octane')->interval('random', function () {
return Str::random(10);
}, seconds: 5);

基于 swoole 你可以为你的应用程序提供更可靠高性能的服务,更多使用说明和示例请参阅 Octane 文档