资讯专栏INFORMATION COLUMN

使用swoole改造laravel应用

cpupro / 2881人阅读

摘要:使用改造应用标签空格分隔概述介绍是为开发的生产级异步编程框架。然后你可以看到以下信息现在可以通过访问来进入应用。

使用swoole改造laravel应用

标签(空格分隔): php


1. 概述 1.1 swoole介绍

Swoole 是为 PHP 开发的生产级异步编程框架。 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTTP, WebSocket 服务, 而不需要拥有太多的非阻塞 I/O 编程和低级别的 Linux 内核知识。 你可以把 Swoole 想象成 Go, 但对于 PHP 来说将有更高性能。

1.2 为什么要在 Swoole 上运行 Laravel?

在PHP的生命周期中, 当你每次运行PHP脚本的时候, PHP都需要初始化模块并为你的运行环境启动zend引擎. 并将PHP脚本编译为OpCodes以便Zend引擎执行.

但是, 这样的生命周期需要在每次请求的时候都执行一遍, 因为单个请求创建的环境在请求结束后立即销毁.

换句话说, 在传统的PHP生命周期中, 为了脚本执行而浪费了大量的时间去创建和销毁资源. 想象一下像laravel这样的框架, 在每次请求中需要加载多少文件? 同时也浪费了大量的I/O操作.

swoole是内置在应用级别的server, 并且所有脚本文件在加载一次之后便可以保存在内存中. 这就是为什么我们需要尝试在swoole上运行laravel.

swoole可以提供强大性能而Laravel则可以提供优雅代码结构. 完美!

2. 准备工作
app php laravel swoole
your.domain.com 7.1.16 5.4.36 4.1.2
2.1 wrk

基准测试工具:wrk

// wrk命令参数
-c, --connections: total number of HTTP connections to keep open with
                   each thread handling N = connections/threads

-d, --duration:    duration of the test, e.g. 2s, 2m, 2h

-t, --threads:     total number of threads to use

-s, --script:      LuaJIT script, see SCRIPTING

-H, --header:      HTTP header to add to request, e.g. "User-Agent: wrk"

    --latency:     print detailed latency statistics

    --timeout:     record a timeout if a response is not received within
                   this amount of time.
2.2 php-swoole安装

pecl install swoole

RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories 
    && sed -i "s/nl.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
RUN apk add --no-cache --virtual .build-deps 
        $PHPIZE_DEPS 
    && docker-php-source extract 
    && cd /usr/src 
    && wget http://pecl.php.net/get/swoole-4.1.2.tgz 
    && tar -xzvf swoole-4.1.2.tgz 
    && mv /usr/src/swoole-4.1.2 /usr/src/php/ext/swoole 
    && docker-php-ext-configure swoole --enable-openssl 
    && docker-php-ext-install swoole 
    && runDeps="$( 
        scanelf --needed --nobanner --format "%n#p" --recursive /usr/local 
            | tr "," "
" 
            | sort -u 
            | awk "system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }" 
      )" 
      && apk add --no-cache --virtual .php-rundeps $runDeps 
    && docker-php-source delete 
    && apk del .build-deps 
    && rm -rf /usr/src/swoole-4.1.2.tgz
2.3 laravel-swoole 扩展安装

以下是 swooletw/laravel-swoole 的主要特点:

在 Swoole 运行 Laravel/Lumen 应用

出色的性能提升至 30x

沙盒模式隔离应用程序容器

支持在 Laravel 应用中运行 WebSocket 服务器

支持 Socket.io 协议

支持 Swoole 表跨进程共享

使用 Composer 安装:

$ composer require swooletw/laravel-swoole
2.4 laravel/lumen配置
这个包支持包自动发现机制。如果你运行 Laravel 5.5 以上版本,你可以跳过这一步。

laravel配置: 在 config/app.php 服务提供者数组添加该服务提供者

[
    "providers" => [
        SwooleTWHttpLaravelServiceProvider::class,
    ],
]

lumen配置: 请将下面的代码添加到 bootstrap/app.php

$app->register(SwooleTWHttpLumenServiceProvider::class);
3. 基准测试数据 3.1 建立并运行起来

现在,你可以执行以下的命令来启动 Swoole HTTP 服务。

php artisan swoole:http start

然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started: http://127.0.0.1:1215

现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。

如果需要修改端口号或服务地址, 可配置相应的环境变量

// vendor/swooletw/laravel-swoole/config/swoole_http.php
SWOOLE_HTTP_HOST: "127.0.0.1"
SWOOLE_HTTP_PORT: "1215"

详细的文档参考: https://wiki.swoole.com/wiki/page/14.html

3.2 基于 FPM + Nginx 的测试结果
wrk -t4 -c100 http://your.domain.com/version

Running 10s test @ http://your.domain.com/version
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   341.64ms  108.70ms 801.47ms   69.08%
    Req/Sec    71.72     27.35   171.00     65.57%
  2864 requests in 10.03s, 2.84MB read
Requests/sec:    285.63
Transfer/sec:    289.79KB
wrk -t12 -c400 -d30s http://your.domain.com/version

Running 30s test @ http://your.domain.com/version
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   801.35ms  349.89ms   2.00s    68.56%
    Req/Sec    40.61     19.83   126.00     65.80%
  14390 requests in 30.10s, 14.24MB read
  Socket errors: connect 0, read 0, write 0, timeout 132
Requests/sec:    478.09
Transfer/sec:    484.34KB
3.3 Swoole HTTP 服务的测试结果
wrk -t4 -c100 http://your.domain.com/version

Running 10s test @ http://your.domain.com/version
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   198.64ms  324.54ms   1.96s    88.59%
    Req/Sec   225.62     91.30   430.00     62.72%
  9021 requests in 10.09s, 7.90MB read
  Socket errors: connect 0, read 0, write 0, timeout 25
Requests/sec:    893.71
Transfer/sec:    801.26KB
wrk -t12 -c400 -d30s http://your.domain.com/version

Running 30s test @ http://your.domain.com/version
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   319.84ms  398.59ms   2.00s    85.59%
    Req/Sec    66.94     35.58   240.00     66.09%
  23862 requests in 30.09s, 20.89MB read
  Socket errors: connect 0, read 0, write 0, timeout 619
Requests/sec:    793.04
Transfer/sec:    711.05KB
4. 问题&注意事项

php7只能用swoole 4.0+ 版本

4.1 静态文件使用swoole性能是否受到影响?

使用Nginx来代理运行于Swoole上的Laravel

server {
    listen 80;
    server_name your.domain.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;
    }
    location / {
        try_files $uri $uri/ @swoole;
    }
    location @swoole {
        set $suffix "";
        if ($uri = /index.php) {
            set $suffix "/";
        }
        proxy_set_header Host $host;
        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;
        # IF https
        # proxy_set_header HTTPS "on";
        proxy_pass http://127.0.0.1:1215$suffix;
    }
}
5. 参考

使用 Swoole 来加速你的 Laravel 应用

swoole 入门指引

laravel-swoole

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30856.html

相关文章

  • 现代化编程 -- 在 Swoole 上开发 Laravel 框架的应用

    摘要:是非常现代化的一套框架基于的构建方式其很多核心依赖并非完全自己所维护而依赖于等较成熟的以此实现现代化框架的集众优于一身站在巨人肩上的特点经过前面的了解我们已经知道给带来的无可比拟的优势但因为一些局限我们无法将其直接用于成熟的框架而需要进行 Laravel Laravel 是非常现代化的一套 PHP 框架, 基于 composer 的构建方式, 其很多核心依赖并非完全 Laravel 自...

    leap_frog 评论0 收藏0
  • Laravel 5.6中 使用Swoole的协程数据库查询

    摘要:首先,确认你是用的是然后,你需要依赖这个包,作用是实现的伪接口将修改成在你的命令中启动,测试下带有数据库查询的接口。如至此,你的项目的协程化改造成功。 Installation 首先,确认你是用的是laravel 5.6 然后,你需要依赖 kuaiapp/db 这个包,作用是实现 SwooleCoroutineMySQL 的伪 PDO 接口 composer require kuai...

    roundstones 评论0 收藏0
  • 了解swoole运行模式,加速laravel应用

    摘要:负责解释执行文件生成响应,最终返回给,展现至前端。相比于传统架构,进程模型最大的特点在于其多线程模式处理网络请求,使得其能轻松应对大量连接。这要求开发人员对于多进程的运行模式有更清晰的认识更容易内存泄露。 一、SwooleSwoole号称重新定义了PHP,它是一个PHP扩展,使得PHP可以使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件...

    时飞 评论0 收藏0
  • 使用 Swoole 来加速你的 Laravel 应用

    摘要:是为开发的生产级异步编程框架。因为单个请求创建的环境在请求执行结束后会立即销毁。可以提供强大性能而则可以提供优雅代码结构使用。在使用这个包之前,请确保你的机器安装了正确的。建立并运行起来现在,你可以执行以下的命令来启动服务。 showImg(https://segmentfault.com/img/bVbaF89?w=1240&h=634); Swoole 是为 PHP 开发的生产级异...

    snifes 评论0 收藏0
  • 使用 Swoole 加速 Laravel

    摘要:因为为单个请求创建的环境将在请求过程完成后立即销毁。可以成为强大的性能增强器,提供了优雅的结构和代码使用方式。你可以使用此命令快速安装它,并访问官方网站获取更多信息。注意目前仅支持和。服务器不能使用。基准测试使用进行干净的测试。 Swoole 是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP,UDP,U...

    didikee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<