iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP Swoole的基本用法
  • 232
分享到

PHP Swoole的基本用法

phpswoole服务器网络http 2023-09-02 11:09:36 232人浏览 八月长安
摘要

目录 【了解Swoole】 【PHP中使用Swoole案例演示】 安装Swoole扩展 Swoole实现TCP请求 Swoole实现UDP请求 Swoole实现HTTP请求 Swoole实现WebSocket聊天室功能 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 SocketHttpwebsocket 等服务,让 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./configuremake && make install然后给php.ini加入swoole.so查看是否编译成功:php -m, 或者 php --ri swoole

查看phpinfo()效果如下:

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

Swoole实现TCP请求

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

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();

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

Swoole实现UDP请求

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

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();

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

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

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

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

Swoole实现HTTP请求

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

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根目录,并且指定参数:

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

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/

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(        "

连接成功!欢迎

" );};websocket.onclose = function (res) { $("#message").append( "

" + res.data + "

" );};websocket.onmessage = function (res) { $("#message").append( "

" + res.data + "

" );};websocket.onerror = function (res, e) { $("#message").append( "

" + res + "

" );};function send() { websocket.send($("#input").val());}

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

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

Swoole执行异步任务 (Task)

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

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('

Hello Swoole. #' . rand(1000, 9999) . '

');});//处理异步任务(此回调函数在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();

Swoole实现Redis服务器

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

//使用 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]));    }});

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

PHPStORM中添加swoole智能提示

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

如果要给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://blog.csdn.net/rxbook/article/details/130471736

--结束END--

本文标题: PHP Swoole的基本用法

本文链接: https://www.lsjlt.com/news/390690.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP Swoole的基本用法
    目录 【了解Swoole】 【PHP中使用Swoole案例演示】 安装Swoole扩展 Swoole实现TCP请求 Swoole实现UDP请求 Swoole实现HTTP请求 Swoole实现WebSocket聊天室功能 Swoole执行异步...
    99+
    2023-09-02
    php swoole 服务器 网络 http
  • PHP基本语法的使用
    本篇内容主要讲解“PHP基本语法的使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP基本语法的使用”吧!PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写。...
    99+
    2023-06-17
  • 【PHP】PHP基本语法
    1、PHP标记 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 ,告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外...
    99+
    2023-10-01
    php 开发语言
  • PHP基本语法
    一.PHP标记 标准标记以“”结束。   二.PHP注释 在PHP开发中,经常需要对程序中的某些代码进行说明,这时,可以使用注释来完成。注释可以理解为代码的解释,它是程序不可缺少的一部分,并且在解析时会被PHP解析器忽略。 在上面的示例代...
    99+
    2023-10-02
    php 开发语言
  • swoole支持的PHP版本有哪些
    这篇文章主要讲解了“swoole支持的PHP版本有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“swoole支持的PHP版本有哪些”吧!一、Swoole支持的PHP版本PHP 7.0 -...
    99+
    2023-07-05
  • PHP函数的基本使用方法
    在现代的网页应用程序中,PHP作为一种重要的服务器端编程语言,被广泛应用。PHP中的函数是一种可重用的代码块,不仅简化了代码的编写,而且提高了代码的可维护性和可读性。本文将介绍PHP函数的基本使用方法,以帮助读者更好地理解和应用PHP函数。...
    99+
    2023-05-22
    方法 PHP函数 基本使用
  • PHP基本语法介绍
    这篇文章主要介绍“PHP基本语法介绍”,在日常操作中,相信很多人在PHP基本语法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP基本语法介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在进行PH...
    99+
    2023-06-17
  • BeautifulSoup的基本用法
          前言 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。 它是一个灵活又方便的网页解析...
    99+
    2023-01-30
    BeautifulSoup
  • ASP.NETIdentity的基本用法
    早在2005年的时候,微软随着ASP.NET 推出了membership机制,十年磨一剑,如今的ASP.NET Identity是否足够强大,一起来体会。 在VS2013下新建项目,...
    99+
    2022-11-13
    ASP.NET Identity 基本用法
  • PHP方法的基本语法与规范
    PHP作为一种流行的服务器端脚本语言,广泛应用于网站开发领域。掌握PHP方法的基本语法和规范对于编写高效、可维护的代码至关重要。本文将详细介绍PHP方法的基本语法和规范,并提供具体的代...
    99+
    2024-02-29
    方法 php 语法
  • Swoole 4.8版本的安装
    1、从github拉取安装包 Release v4.8.13 · swoole/swoole-src · GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、...
    99+
    2023-10-27
    1024程序员节
  • swoole框架的使用方法
    这篇文章将为大家详细讲解有关swoole框架的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、Lar...
    99+
    2023-06-14
  • php中swoole的作用有哪些
    这篇文章主要介绍了php中swoole的作用有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP 中的 Node ?Swoole 到底是什么?我先从官方文档中引用下 S...
    99+
    2023-06-15
  • requests基本用法
    requests比起urllib更加方便简单,有了它,cookies,登陆验证,代理设置等操作都很容易解决.安装requestspip3 install requests基本用法import requests r =&...
    99+
    2023-01-30
    requests
  • Html.DropDownListFor基本用法
    Html.DropDownListFor是ASP.NET MVC框架中用于创建下拉列表的HTML Helper方法。它的基本用法如下...
    99+
    2023-09-27
    用法
  • DecimalFormat基本用法
    DecimalFormat是一个用来格式化数字的类。它可以将数字格式化为不同的形式,比如保留小数位、添加千位分隔符等。基本用法如下:...
    99+
    2023-09-09
    用法
  • php运算符的基本使用
    $base = 20; $height = 10; $area = $base * $height; 我用来将base与height相乘的* ,就是乘法运算。 我们有相当多的运算符,让我们对主要的运算符做一个简单的总结。 首先,这里是算术运...
    99+
    2023-10-23
    php 开发语言
  • php基本的输出方法有哪些
    这篇文章主要介绍“php基本的输出方法有哪些”,在日常操作中,相信很多人在php基本的输出方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php基本的输出方法有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • php的基本语句
    ## PHP初识 ###  为什么学php      通过live serve 起的假的服务不能做逻辑处理   所以为了熟悉前后端交互 业务流程   学习php ###  什么是php      PHP 是一种创建动态交互性站点的强有力的...
    99+
    2023-09-18
    php 开发语言 后端
  • 【PHP】PHP基本语法、PHP的数据类型、PHP数据的输出
    PHP标记符 PHP标记符能够让web服务器识别PHP代码的开始和结束,两个标记中间的所有文本都会被解释为PHP代码,而标记外的任何文本都会被认为是普通的HTML,这就是PHP标记的作用,PHP一共支持4种标记风格 XML风格(最常用) ...
    99+
    2023-09-07
    php 服务器 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作