PHP Swoole的基本用法

这篇具有很好参考价值的文章主要介绍了PHP Swoole的基本用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

【了解Swoole】

【PHP中使用Swoole案例演示】

安装Swoole扩展

Swoole实现TCP请求

Swoole实现UDP请求

Swoole实现HTTP请求

Swoole实现WebSocket聊天室功能

Swoole执行异步任务 (Task)

Swoole实现Redis服务器

PHPStorm中添加swoole智能提示


【了解Swoole】

为什么要学习使用swoole,首先说说PHP存在的缺陷:

  • 不能常驻内存
  • 对多线程支持不好,不支持协程
  • 解释性语言

Swoole官网: Swoole - PHP 协程框架 是这么说明的:

Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务,让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期, 为性能的提升提供了独一无二的可能性。Swoole 可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。

Swoole的特性:

  • Swoole使用C/C++语言编写,提供了PHP语言的异步多线程服务器、异步TCP/UDP网络客户端、异步MySQL、异步Redis、数据库连接池、AsyncTask、 消息队列、毫秒定时器、异步文件读写、异步DNS查询。Swoole内置了Http/WebSocket服务器端/客户端、Http2.0 服务器端。
  • 除了异步IO的支持之外, Swoole为PHP多进程的模式设计了多个并发数据结构和IPC通信机制,可以大大简化多进程并发编程的工作。其中包括了原子计数器、Table、 Channel、Lock、进程间通信IPC等丰富的功能特性。
  • Swoole4.0支持了类似Go语言的协程,可以使用完全同步的代码实现异步程序。PHP 代码无需额外增加任何关键词,底层自动进行协程调度,实现异步IO。

Swoole的优点:

  • 高性能的异步
  • 提供了网络通信的能力
  • 方便地开发 Http、WebSocket、TCP、UDP 等应用
  • 协程

【PHP中使用Swoole案例演示】

安装Swoole扩展

下载swoole,进入swoole目录,编译安装:

phpize
./configure
make && make install
然后给php.ini加入swoole.so

查看是否编译成功:php -m, 或者 php --ri swoole

查看phpinfo()效果如下:

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

Swoole源码包里面 examples/server 目录下有个 eho.php,运行:php echo.php
使用 netstat -anp | grep 9501 查看端口情况(Mac不能带参数p,或者用 lsof -i:9501)

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

Swoole实现TCP请求

官网资料:https://wiki.swoole.com/#/start/start_tcp_server

<?php

class TCP {
    private $server = null;

    public function __construct() {
        $this->server = new Swoole\Server("127.0.0.1", 9501);
        $this->server->set([
            'worker_num' => 4,
            'max_request' => 50,
        ]);
        $this->server->on('Connect', [$this, "onConnect"]);
        $this->server->on('Receive', [$this, "onReceive"]);
        $this->server->on('Close', [$this, "onClose"]);

        //启动服务器
        $this->server->start();
    }

    public function onConnect($server, $fd) {
        echo "客户端id: {$fd} 链接.\n";
    }

    public function onReceive($server, $fd, $from_id, $data) {
        $server->send($fd, "发送的数据:" . $data);
    }

    public function onClose($server, $fd) {
        echo "客户端id: {$fd}关闭.\n";
    }

}

new TCP();

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

  • 服务器可以同时被成千上万个客户端连接,$fd 就是客户端连接的唯一标识符。
  • 调用 $server->send() 方法向客户端连接发送数据,参数就是 $fd 客户端标识符。
  • 调用 $server->close() 方法可以强制关闭某个客户端连接。
  • 客户端可能会主动断开连接,此时会触发 onClose 事件回调。 

Swoole实现UDP请求

官网资料:https://wiki.swoole.com/#/start/start_udp_server

<?php

class UDP {
    private $server = null;

    public function __construct() {
        $this->server = new Swoole\Server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
        $this->server->set([
            'worker_num' => 4,
            'max_request' => 50,
        ]);
        $this->server->on('Packet', [$this, "onPacket"]);

        //启动服务器
        $this->server->start();
    }

    public function onPacket($server, $data, $clientInfo) {
        var_dump($clientInfo);
        $server->sendto($clientInfo['address'], $clientInfo['port'], "Server:{$data}");
    }
}

new UDP();

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

UDP 服务器与 TCP 服务器不同,UDP 没有连接的概念。启动 Server 后,客户端无需 Connect,直接可以向 Server 监听的 9502 端口发送数据包。对应的事件为 onPacket。

  • $clientInfo 是客户端的相关信息,是一个数组,有客户端的 IP 和端口等内容。
  • 调用 $server->sendto 方法向客户端发送数据。

如何理解TCP和UDP:TCP 是面向连接的、可靠的、只支持点对点通信;UDP 是无连接的、不可靠的、支持一对一、一对多、多对一、多对多的通信模式。

TCP就像是两个人打电话,你必须听清楚对方讲的什么才能知道回复什么;而UDP就像是马路上的广播,它不会在乎你有没有听到,错过就是错过了。

Swoole实现HTTP请求

官网资料:https://wiki.swoole.com/#/start/start_http_server

<?php

class HTTP {
    private $http = null;

    public function __construct() {
        $this->http = new Swoole\Http\Server('0.0.0.0', 9503);
        $this->http->set([
            'enable_static_handler' => true,
            'document_root' => "./static",
        ]);
        $this->http->on('Request', [$this, "onRequest"]);

        //启动服务器
        $this->http->start();
    }

    public function onRequest($request, $response) {
        var_dump($request->get, $request->post);


        $response->header('Content-Type', 'text/html; charset=utf-8');
        $response->end('Hello Swoole.' . json_encode($request->get));
    }
}

new HTTP();

通过浏览器访问http根目录,并且指定参数:

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

通过浏览器直接访问静态资源html:

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

HTTP 服务器只需要关注请求响应即可,所以只需要监听一个 onRequest 事件。当有新的 HTTP 请求进入就会触发此事件。事件回调函数有 2 个参数,一个是 $request 对象,包含了请求的相关信息,如 GET/POST 请求的数据。另外一个是 response 对象,对 request 的响应可以通过操作 response 对象来完成。$response->end() 方法表示输出一段 HTML 内容,并结束此请求。

  • 0.0.0.0 表示监听所有 IP 地址,一台服务器可能同时有多个 IP,如 127.0.0.1 本地回环 IP、192.168.1.100 局域网 IP、210.127.20.2 外网 IP,这里也可以单独指定监听一个 IP;
  • 9501 监听的端口,如果被占用程序会抛出致命错误,中断执行。

Swoole实现WebSocket聊天室功能

官网资料:https://wiki.swoole.com/#/start/start_ws_server

<?php

class WS {
    private $http = null;

    public function __construct() {
        //第三和第四个参数,是在https的情况下需要配置的
        //$this->http = new Swoole\WebSocket\Server('0.0.0.0', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
        $this->http = new Swoole\WebSocket\Server('0.0.0.0', 9502);

        $this->http->set([
            //下面的部分也是用来配置https的ssl证书的
            'ssl_cert_file' => "",
            'ssl_key_file' => "",

            'enable_static_handler' => true,
            'document_root' => "./static",
        ]);
        $this->http->on('Open', [$this, "onOpen"]);
        $this->http->on('Message', [$this, "onMessage"]);
        $this->http->on('Close', [$this, "onClose"]);

        //启动服务器
        $this->http->start();
    }

    public function onOpen($ws, $request) {
        $ws->push($request->fd, "hello,welcome\n");
    }

    public function onMessage($ws, $frame) {
        echo "Message: {$frame->data}\n";
        foreach ($ws->connections as $fd) {
            if ($fd == $frame->fd) {
                $ws->push($fd, "我: {$frame -> data}");
            } else {
                $ws->push($fd, "对方:{$frame -> data}");
            }
        }
    }

    public function onClose($ws, $fd) {
        echo "client:{$fd} is closed\n";
    }
}

new WS();

客户端JS代码:

var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (res) {
    $("#welcome").append(
        "<h1>连接成功!欢迎</h1>"
    );
};
websocket.onclose = function (res) {
    $("#message").append(
        "<h3>" + res.data + "</h3>"
    );
};
websocket.onmessage = function (res) {
    $("#message").append(
        "<h3>" + res.data + "</h3>"
    );
};
websocket.onerror = function (res, e) {
    $("#message").append(
        "<h3>" + res + "</h3>"
    );
};
function send() {
    websocket.send($("#input").val());
}

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

如何理解WebSocket:是一种基于 TCP 的轻量级网络通信协议,在地位上是与 HTTP“平级”的。HTTP 难以应用在动态页面、即时消息、网络游戏等要求“实时通信”的领域;WebSocket 客户端和服务器都可以随时向对方发送数据。

  • 客户端向服务器端发送信息时,服务器端触发 onMessage 事件回调。
  • 服务器端可以调用 $server->push() 向某个客户端(使用 $fd 标识符)发送消息。

Swoole执行异步任务 (Task)

官网资料:https://wiki.swoole.com/#/start/start_task

<?php

$http = new Swoole\Http\Server('0.0.0.0', 9501);

$http->set([
//    'worker_num' => 1,
    //如果要使用 Task ,需要先设置 task_worker_num ,它代表的是开启的 Task 进程数量。
    'task_worker_num' => 4,
]);

$http->on('Request', function ($request, $response) use ($http) {
    echo "接收到了请求", PHP_EOL;
    $response->header('Content-Type', 'text/html; charset=utf-8');

    $http->task("发送邮件");
    $http->task("发送广播");
    $http->task("执行队列");

    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});

//处理异步任务(此回调函数在task进程中执行)
//Task 事件是用于处理任务的,可以根据传递过来的 $data 内容进行处理。
$http->on('Task', function ($serv, $task_id, $reactor_id, $data) {
    $sec = rand(1, 5);
    echo "New AsyncTask[id={$task_id}] sleep sec: {$sec}" . PHP_EOL;
    sleep($sec);
    //返回任务执行的结果
    $serv->finish("{$data} -> OK");
});

//处理异步任务的结果(此回调函数在worker进程中执行)
//Finish 事件是监听任务结束,当执行的任务结束后,就会调用这个事件回调,可以进行后续的处理。如果你的任务没有后续的处理,那么我们也可以不去监听这个事件。
$http->on('Finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[{$task_id}] Finish: {$data}" . PHP_EOL;
});

echo "服务启动", PHP_EOL;
$http->start();

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

Swoole实现Redis服务器

官网资料:https://wiki.swoole.com/#/redis_server

//使用 setHandler() 方法来监听 Reids 命令,在这里我们看到了熟悉的 get、set 等命令的定义。
$server->setHandler('GET', function ($fd, $data) use ($server) {
    if (count($data) == 0) {
        return $server->send($fd, Server::format(Server::ERROR, "ERR wrong number of arguments for 'GET' command"));
    }

    $key = $data[0];
    //指定了 $server->data ,可以将它看成是一个数据源,直接使用的就是一个文件,
    //直接在当前测试环境目录下创建一个叫做 db 的空文件就可以了。
    if (empty($server->data[$key])) {
        //使用 send() 方法来返回响应的命令信息,并通过 format() 方法格式化返回的响应数据。
        return $server->send($fd, Server::format(Server::NIL));
    } else {
        return $server->send($fd, Server::format(Server::STRING, $server->data[$key]));
    }
});

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

以上内容完整代码参考: https://gitee.com/rxbook/thinkphp-demo-2023/tree/master/swoole_test1

PHPStorm中添加swoole智能提示

备注,默认情况下PHPStorm中是不提示Swoole相关函数信息的,比如下面这样:

php swoole,PHP,Swoole,php,swoole,服务器,网络,http

如果要给PHPStorm中添加swoole智能提示,方法如下:

下载函数库 git clone https://github.com/eaglewu/swoole-ide-helper.git

加载方式1: 右键External Libraries,选择Configure PHP Include Path, 选择下载好的swoole-ide-helper目录,点击确定, 只提供给本项目使用。

加载方式2: 将代码包含到PhpStorm的Settings->Languages & Frameworks->PHP->Include path里面, 提供给本机使用。文章来源地址https://www.toymoban.com/news/detail-668505.html

到了这里,关于PHP Swoole的基本用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PHP】Swoole:一款强大的PHP网络编程工具

    在科学计算领域,Swoole是一款功能强大的PHP扩展,它提供了高性能的网络通信和异步编程功能。Swoole不仅支持TCP、UDP、Unix Socket和HTTP等通信协议,还具有异步并发处理能力,使得PHP开发者能够轻松地构建高性能的网络应用程序。 Swoole起源于2011年,是由Swoft创始人林巧(QianM

    2024年02月10日
    浏览(56)
  • PHP代码加密实战过程 Swoole Loader

    帮一个客户处理一个小程序bug修复,前面不知道客户是直接购买一个倒闭的公司产品,还是破解版本的。 其中一些核心工具类代码进行了加密,通过排查就找到了 Swoole Compiler  今天演示下如何进行代码加密: 大致步骤 如下: 注册 Swoole Compiler  账号 地址:Swoole-Compiler - 最

    2024年02月11日
    浏览(35)
  • ThinkPHP为什么用PHP+Swoole协程模式部署运行

    看很多ThinkPHP框架的程序商城等系统,现在都用PHP+Swoole协程来运行。在说Swoole前我们先了解下传统PHP模式。 互联网发展早期,大部分项目的业务逻辑并没有那么复杂,技术生态相对比较简单,也没有 Composer 这样的包管理系统,程序代码足够简单。大部分 PHP 项目没有框架,或

    2024年01月17日
    浏览(43)
  • PHP用Swoole的WebSocket功能编写聊天室Demo

    前提: linux环境下PHP有可用的Swoole扩展。 9501端口可访问。 后端 前端

    2024年02月10日
    浏览(47)
  • windows 搭建 PHP以及扩展swoole的运行环境(Cygwin模拟Linux环境)

    cygwin下载地址:https://www.cygwin.com/ 在浏览器中打开cygwin官网,下滑到Installing Cygwin部分,点击setup-x86_64.exe下载exe文件即可 安装cygwin 找到刚才下载的setup-x86_64.exe文件,双击打开,就开始安装cygwin 第一步:打开安装界面,直接点击下一步 第二步:选择下载源,我们直接默认选

    2024年02月07日
    浏览(45)
  • 因项目只做socket客户端,不想用workerman或者swoole框架,简单实现ws PHP客户端

    docs/Client.md · master · mirrors / Textalk / websocket-php · GitCode

    2024年02月13日
    浏览(52)
  • 为什么TM服务器要安装php~ 现在服务器都用什么php环境,服务器安装php环境的作用是什么?

    \\\"想像力比知识更重要。因为知识是有限的,而想像力是无限,它包含了一切,推动着进步,是人类进化的源泉。 -- 爱因斯坦 为什么服务器要安装php~ 导读:今天来给各位分享关于服务器为什么安装PHP的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开

    2024年02月16日
    浏览(55)
  • Swoole协程系统HTTP服务

    先启动宝塔  /etc/init.d/bt start 源码参考 https://github.com/zhangyue0503/swoole/tree/main/4.Swoole%E5%8D%8F%E7%A8%8B 对于异步来说,我们需要监听事件,并且监听的进程是并发的,所以会有一个问题,那就是无法保证前后顺序。 在这个例子中,我们通过在 Connect 事件中暂停5秒,来模拟 connect

    2024年02月15日
    浏览(41)
  • PHP进阶-IIS服务器发布PHP网站

    IIS服务器,相信开发者都不会陌生,它的英文全称是Internet Information Services,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务,常用于Windows系统的Web项目部署,本篇以PHP项目为例,讲解如何使用IIS完成PHP项目的发布。 下载地址:PHP: Downloads下载最新版本 下载Thr

    2024年04月28日
    浏览(45)
  • php连接到 Web 服务器方式和php版本选择

    1、如何将 PHP 连接到 Web 服务器? web 服务器可以通过三种方法来利用 PHP 生成 web 页面。 第一种方法是将 PHP 自以为 CGI“包装器”用作一个单独运行的语言解释器(CGI Wapper)。当以这种方法运行时,PHP 会为向 web 服务器的每个 PHP 页面请求创建 PHP 解释器的实例,并在每个请求的

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包