资讯专栏INFORMATION COLUMN

Swoole HTTP 的应用

BlackMass / 3192人阅读

摘要:概述这是关于学习的第四篇文章的应用。主要使用了的两大对象请求对象响应对象。,包括状态响应体跳转发送文件等。对协议的支持并不完整,建议仅作为应用服务器。

概述

这是关于 Swoole 学习的第四篇文章:Swoole HTTP 的应用。

第三篇:Swoole WebSocket 的应用

第二篇:Swoole Task 的应用

第一篇:Swoole Timer 的应用

我们都知道 HTTP 是一种协议,允许 WEB 服务器和浏览器通过互联网进行发送和接受数据。

想对 HTTP 进行详细的了解,可以找下其他文章。

我们在网上能看到的界面,图片,动画,音频,视频 等,都有依赖这个协议的。

在做 WEB 系统的时候,都使用过 IIS、Apache、Nginx 吧,我们利用 Swoole 也可以 简单的实现一个 WEB 服务器。

主要使用了 HTTP 的两大对象:Request 请求对象、Response 响应对象。

Request,包括 GET、POST、COOKIE、Header等。

Response,包括 状态、响应体、跳转、发送文件等。

不多说,分享两个程序:

一、实现一个基础的 Demo:“你好,Swoole.”

二、实现一个简单的 路由控制

本地版本:

PHP 7.2.6

Swoole 4.3.1

代码

一、Demo:“你好,Swoole.”

示例效果:

备注:IP 地址是我的虚拟机。

示例代码:

serv = new swoole_http_server("0.0.0.0", 9502);
        $this->serv->set([
            "worker_num"      => 2, //开启2个worker进程
            "max_request"     => 4, //每个worker进程 max_request设置为4次
            "daemonize"       => false, //守护进程(true/false)
        ]);

        $this->serv->on("Start", [$this, "onStart"]);
        $this->serv->on("WorkerStart", [$this, "onWorkStart"]);
        $this->serv->on("ManagerStart", [$this, "onManagerStart"]);
        $this->serv->on("Request", [$this, "onRequest"]);

        $this->serv->start();
    }

    public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onManagerStart($serv) {
        echo "#### onManagerStart ####".PHP_EOL.PHP_EOL;
    }

    public function onWorkStart($serv, $worker_id) {
        echo "#### onWorkStart ####".PHP_EOL.PHP_EOL;
    }

    public function onRequest($request, $response) {
        $response->header("Content-Type", "text/html; charset=utf-8");
        $html = "

你好 Swoole.

"; $response->end($html); } } $server = new Server();

二、路由控制

示例效果:

目录结构:

├─ swoole_http  -- 代码根目录
│  ├─ server.php
│  ├─ controller
│     ├── Index.php
│     ├── Login.php

示例代码:

server.php

serv = new swoole_http_server("0.0.0.0", 9501);
        $this->serv->set([
            "worker_num"      => 2, //开启2个worker进程
            "max_request"     => 4, //每个worker进程 max_request设置为4次
            "document_root"   => "",
            "enable_static_handler" => true,
            "daemonize"       => false, //守护进程(true/false)
        ]);

        $this->serv->on("Start", [$this, "onStart"]);
        $this->serv->on("WorkerStart", [$this, "onWorkStart"]);
        $this->serv->on("ManagerStart", [$this, "onManagerStart"]);
        $this->serv->on("Request", [$this, "onRequest"]);

        $this->serv->start();
    }

    public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        swoole_set_process_name("swoole_process_server_master");

        echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onManagerStart($serv) {
        echo "#### onManagerStart ####".PHP_EOL.PHP_EOL;
        swoole_set_process_name("swoole_process_server_manager");
    }

    public function onWorkStart($serv, $worker_id) {
        echo "#### onWorkStart ####".PHP_EOL.PHP_EOL;
        swoole_set_process_name("swoole_process_server_worker");

        spl_autoload_register(function ($className) {
            $classPath = __DIR__ . "/controller/" . $className . ".php";
            if (is_file($classPath)) {
                require "{$classPath}";
                return;
            }
        });
    }

    public function onRequest($request, $response) {
        $response->header("Server", "SwooleServer");
        $response->header("Content-Type", "text/html; charset=utf-8");
        $server = $request->server;
        $path_info    = $server["path_info"];
        $request_uri  = $server["request_uri"];

        if ($path_info == "/favicon.ico" || $request_uri == "/favicon.ico") {
            return $response->end();
        }

        $controller = "Index";
        $method     = "home";


        if ($path_info != "/") {
            $path_info = explode("/",$path_info);
            if (!is_array($path_info)) {
                $response->status(404);
                $response->end("URL不存在");
            }

            if ($path_info[1] == "favicon.ico") {
                return;
            }

            $count_path_info = count($path_info);
            if ($count_path_info > 4) {
                $response->status(404);
                $response->end("URL不存在");
            }

            $controller = (isset($path_info[1]) && !empty($path_info[1])) ? $path_info[1] : $controller;
            $method = (isset($path_info[2]) && !empty($path_info[2])) ? $path_info[2] : $method;
        }

        $result = "class 不存在";

        if (class_exists($controller)) {
            $class = new $controller();
            $result = "method 不存在";
            if (method_exists($controller, $method)) {
                $result = $class->$method($request);
            }
        }

        $response->end($result);
    }
}

$server = new Server();

Index.php

get) ? $request->get : [];

        //@TODO 业务代码

        $result = "

你好,Swoole。

"; $result.= "GET参数:".json_encode($get); return $result; } }

Login.php

post) ? $request->post : [];

        //@TODO 业务代码

        return "

登录成功。

"; } }
小结

一、Swoole 可以替代 Nginx 吗?

暂时不能,随着 Swoole 越来越强大,以后说不准。

官方建议 Swoole 与 Nginx 结合使用。

HttpServer 对 Http 协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。

根据自己的 Nginx 配置文件,可以自行调整。

比如:新增一个配置文件

enable-swoole-php.conf

location ~ [^/].php(/|$)
{
    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://127.0.0.1:9501;
}

我们都习惯会将虚拟域名的配置文件放在 vhost 文件夹中。

比如,虚拟域名的配置文件为:local.swoole.com.conf,可以选择加载 enable-php.conf ,也可以选择加载 enable-swoole-php.conf。

配置文件供参考:

server
    {
        listen 80;
        #listen [::]:80;
        server_name local.swoole.com ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/project/swoole;

        #include rewrite/none.conf;
        #error_page   404   /404.html;

        #include enable-php.conf;
        include enable-swoole-php.conf;

        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /.
        {
            deny all;
        }

        access_log  /home/wwwlogs/local.swoole.com.log;
    }

如果直接编辑 server 段的代码也是可以的。

二、修改了 controller 文件夹中的业务代码,每次都是重启服务才生效吗?

不是,每次重启服务会影响到正常用户使用的,正常处理的请求会被强制关闭。

在本地运行路由的代码时,试试这个命令:

ps aux | grep swoole_process_server_master | awk "{print $2}" | xargs kill -USR1

给 master 进程发送一个 USR1 的信号,当 Swoole Server 接到这个信号后,就会让所有 worker 在处理完当前的请求后,进行重启。

如果查看所有的进程,试试这个命令:

ps -ef | grep "swoole_process_server" | grep -v "grep"

需要文章中源码的,关注公众号,回复“swoole http”即可。

扩展

可以试着上传文件,做一个小的FTP服务器。

可以试着整合到目前正在使用的PHP框架中。

可以学习一些Swoole开源框架:EasySwoole、Swoft、One。

推荐阅读

系统的讲解 - SSO 单点登录

系统的讲解 - PHP WEB 安全防御

系统的讲解 - PHP 缓存技术

系统的讲解 - PHP 接口签名验证

系统的讲解 - PHP 浮点数高精度运算

本文欢迎转发,转发请注明作者和出处,谢谢!

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

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

相关文章

  • 了解swoole运行模式,加速laravel应用

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

    时飞 评论0 收藏0
  • 使用swoole改造laravel应用

    摘要:使用改造应用标签空格分隔概述介绍是为开发的生产级异步编程框架。然后你可以看到以下信息现在可以通过访问来进入应用。 使用swoole改造laravel应用 标签(空格分隔): php 1. 概述 1.1 swoole介绍 Swoole 是为 PHP 开发的生产级异步编程框架。 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP,...

    cpupro 评论0 收藏0
  • Swoft 源码剖析 - Swoole和Swoft那些事 (Http/Rpc服务篇)

    摘要:和服务关系最密切的进程是中的进程组,绝大部分业务处理都在该进程中进行。随后触发一个事件各组件通过该事件进行配置文件加载路由注册。事件每个请求到来时仅仅会触发事件。服务器生命周期和服务基本一致,详情参考源码剖析功能实现 作者:bromine链接:https://www.jianshu.com/p/4c0...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。S...

    张汉庆 评论0 收藏0
  • 使用 Swoole 来加速你 Laravel 应用

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

    snifes 评论0 收藏0
  • swoolefy-基于swoole扩展实现高性能常驻内存型API和Web应用服务框架

    摘要:是一个基于扩展实现的轻量级高性能的常驻内存型的和应用服务框架高度封装了,,服务器,以及基于实现可扩展的服务,同时支持包方式安装部署项目。基于实用,抽象事件处理类,实现与底层的回调的解耦,支持同步异步调用,内置等常用组件等。 swoolefy swoolefy是一个基于swoole扩展实现的轻量级高性能的常驻内存型的API和Web应用服务框架,高度封装了http,websocket,ud...

    lewinlee 评论0 收藏0

发表评论

0条评论

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