【后端】Swoole利用教程

打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

目录
一、Swoole基础功能
1. 安装Swoole
1.2 创建一个简朴的TCP服务器
1.3 创建客户端连接服务器
1.4 异步任务和定时器
1.5 WebSocket服务器
二、Swoole高级功能
2.1 异步MySQL查询
2.2 利用Swoole Table进行高效内存数据共享
2.3 HTTP服务器
2.4 WebSocket通信
2.5 异步任务


        Swoole是一个高性能的PHP网络通信框架,它支持异步多线程服务器、异步TCP/UDP网络客户端、异步任务、定时器、异步MySQL、异步Redis、WebSocket、Http Server、Http Client等组件。
一、Swoole基础功能

1. 安装Swoole

        首先确保你已经安装了PHP,而且版本至少是PHP 7.1。然后通过Composer安装Swoole:
  1. composer require "swoole/swoole-src":"~4.0"
复制代码
1.2 创建一个简朴的TCP服务器

        创建一个名为server.php的文件,并写入以下代码:
  1. <?php
  2. $server = new Swoole\Server("***.*.*.*", 9501);
  3. $server->on("Start", function ($server) {
  4.     echo "Server is started.\n";
  5. });
  6. $server->on("Receive", function ($server, $fd, $reactor_id, $data) {
  7.     $server->send($fd, "Server: " . $data);
  8. });
  9. $server->start();
复制代码
        运行server.php启动服务器:
  1. php server.php
复制代码
1.3 创建客户端连接服务器

        创建一个名为client.php的文件,并写入以下代码:
  1. <?php
  2. $client = new Swoole\Client(SWOOLE_SOCK_TCP);
  3. if (!$client->connect('***.*.*.*', 9501, 0.5)) {
  4.     echo "Connect failed\n";
  5.     exit;
  6. }
  7. for ($i = 0; $i < 10; $i++) {
  8.     $client->send("hello world");
  9.     $ret = $client->recv();
  10.     echo "Received: {$ret}\n";
  11. }
  12. $client->close();
复制代码
        运行client.php连接服务器并发送消息:
  1. php client.php
复制代码
1.4 异步任务和定时器

        Swoole支持异步任务处理和定时器,可以用来执行耗时操作而不壅闭主服务器进程。以下是一个利用异步任务的示例:
  1. $server->on("Task", function ($serv, $task_id, $src_id, $data) {
  2.     // 异步执行耗时任务
  3.     sleep(1);
  4.     $serv->finish("Task#{$task_id} completed");
  5. });
  6. $server->on("Finish", function ($serv, $task_id, $data) {
  7.     echo "Task#{$task_id} return: {$data}\n";
  8. });
  9. // 在Receive事件中分配异步任务
  10. $server->on("Receive", function ($serv, $fd, $reactor_id, $data) {
  11.     $serv->task($data);
  12. });
复制代码
1.5 WebSocket服务器

        Swoole还支持WebSocket协议,可以用来创建及时的双向通信应用。以下是一个简朴的WebSocket服务器示例:
  1. $server = new Swoole\WebSocket\Server("*.*.*.*", 9502);
  2. $server->on("open", function ($server, $request) {
  3.     $server->push($request->fd, "hello, welcome\n");
  4. });
  5. $server->on("message", function ($server, $frame) {
  6.     echo "Message: {$frame->data}\n";
  7.     $server->push($frame->fd, "server: {$frame->data}");
  8. });
  9. $server->on("close", function ($ser, $fd) {
  10.     echo "client#{$fd} is closed\n";
  11. });
  12. $server->start();
复制代码
        以上是Swoole的基础利用教程,涵盖了创建TCP服务器、客户端、异步任务和WebSocket服务器的基本步调。Swoole功能非常强大,发起深入阅读官方文档和示例来把握更多高级特性。
二、Swoole高级功能

2.1 异步MySQL查询

        Swoole支持异步MySQL客户端,可以在不壅闭主服务器进程的情况下执行数据库查询。这对于必要频繁访问数据库的应用来说非常有用。
  1. $server = new Swoole\Server("127.0.0.1", 9501);
  2. $server->on('start', function ($server) {
  3.     echo "Swoole server is started at http://127.0.0.1:9501\n";
  4. });
  5. $server->on('receive', function ($server, $fd, $from_id, $data) {
  6.     // 异步查询数据库
  7.     $db = new Swoole\Coroutine\MySQL();
  8.     $server->defer(function () use ($db) {
  9.         $db->close();
  10.     });
  11.     $db->connect([
  12.         'host' => '127.0.0.1',
  13.         'user' => 'your_user',
  14.         'password' => 'your_password',
  15.         'database' => 'test',
  16.         'charset' => 'utf8',
  17.     ]);
  18.     $sql = "SELECT * FROM your_table WHERE id = ?";
  19.     $stmt = $db->prepare($sql);
  20.     $result = $stmt->execute([1]);
  21.     if ($result) {
  22.         $row = $stmt->fetch();
  23.         $server->send($fd, json_encode($row));
  24.     } else {
  25.         $server->send($fd, "Error: " . $db->error);
  26.     }
  27. });
  28. $server->start();
复制代码
        留意:上面的代码示例利用了Swoole的协程MySQL客户端,它必要在Swoole 4.1.0 或更高版本中启用协程支持。`$server->defer` 用于确保在协程结束时关闭数据库连接。
2.2 利用Swoole Table进行高效内存数据共享

        Swoole Table 是一个基于共享内存的高性能数据结构,实用于存储必要频繁访问和更新的数据,如在线用户列表、会话信息等。
  1. $table = new Swoole\Table(1024);
  2. $table->column('fd', Swoole\Table::TYPE_INT);
  3. $table->column('username', Swoole\Table::TYPE_STRING, 32);
  4. $table->create();
  5. $server = new Swoole\Server("127.0.0.1", 9501);
  6. $server->on('start', function ($server) use ($table) {
  7.     echo "Swoole server is started.\n";
  8. });
  9. $server->on('connect', function ($server, $fd) use ($table) {
  10.     // 假设在连接时设置用户名为"user$fd"
  11.     $table->set($fd, ['fd' => $fd, 'username' => "user$fd"]);
  12. });
  13. $server->on('receive', function ($server, $fd, $from_id, $data) use ($table) {
  14.     $userInfo = $table->get($fd);
  15.     echo "Received data from {$userInfo['username']}: {$data}\n";
  16. });
  17. $server->start();
复制代码
        留意:上面的代码示例仅用于演示怎样在连接变乱中设置Swoole Table,并在接收数据时读取它。在实际应用中,您大概必要更复杂的逻辑来处理用户认证和数据验证。
2.3 HTTP服务器

        Swoole也支持HTTP服务器,可以直接处理HTTP哀求而不必要Nginx或Apache等外部Web服务器。
  1. $http = new Swoole\Http\Server("127.0.0.1", 9501);
  2. $http->on('request', function ($request, $response) {
  3.     $response->header('Content-Type', 'text/plain');
  4.     $response->end("Hello Swoole\n");
  5. });
  6. $http->start();
复制代码
        这个简朴的HTTP服务器会对所有哀求返回"Hello Swoole"的响应。
2.4 WebSocket通信

        WebSocket提供了一种在单个TCP连接上进行全双工通信的方式,非常适合及时应用,如谈天室、及时通知等。Swoole的WebSocket服务器可以很容易地集成到现有的Swoole服务器中。
  1. $server = new Swoole\WebSocket\Server("127.0.0.1", 9502);
  2. $server->on("open", function ($server, $request) {
  3.     echo "New connection: {$request->fd}\n";
  4. });
  5. $server->on("message", function ($server, $frame) {
  6.     echo "Received message: {$frame->data}\n";
  7.     $server->send($frame->fd, "Server: {$frame->data}");
  8. });
  9. $server->on("close", function ($server, $fd) {
  10.     echo "Connection closed: {$fd}\n";
  11. });
  12. $server->start();
复制代码
        在这个例子中,我们创建了一个WebSocket服务器监听在本地的9502端口。当有新的WebSocket连接打开时,会触发`open`变乱;当收到客户端发送的消息时,会触发`message`变乱;当连接关闭时,会触发`close`变乱。
2.5 异步任务

        Swoole提供了异步任务处理的能力,允许你在不壅闭主变乱循环的情况下执行耗时的操作。这对于执行数据库查询、文件操作等任务非常有用。
  1. $server = new Swoole\Server("***.*.*.*", 9503);
  2. $server->on("request", function ($request, $response) {
  3.     $task_id = $server->task([
  4.         'action' => 'heavy_computation',
  5.         'data' => $request->post
  6.     ]);
  7.     $response->end("Task ID: {$task_id}\n");
  8. });
  9. $server->on("task", function ($server, $task_id, $src_worker_id, $data) {
  10.     // 模拟耗时操作
  11.     sleep(1);
  12.     $result = "Result of {$data['action']}";
  13.     // 将结果返回给worker进程
  14.     $server->finish($result);
  15. });
  16. $server->on("finish", function ($server, $task_id, $data) {
  17.     echo "Task #{$task_id} finished: {$data}\n";
  18. });
  19. $server->start();
复制代码
        在这个例子中,我们创建了一个HTTP服务器,当接收到哀求时,它会将一个任务异步地发送到任务队列。然后,它会立即返回一个响应给客户端,告诉它任务ID。在后台,一个worker进程会处理这个任务,并在完成后将结果返回给服务器。
        通过这些示例,我们可以看到Swoole在构建高性能、异步、并行的PHP应用方面的强大能力。无论是WebSocket通信、异步任务处理,还是内存数据共享,Swoole都提供了丰富的功能来满意各种复杂场景的需求。
        Swoole是一个功能强大的工具,以上只是其浩繁功能中的一小部门。为了充分利用Swoole,发起深入阅读其官方文档和社区资源。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表