天津储鑫盛钢材现货供应商 发表于 2025-1-4 07:58:44

【后端】Swoole利用教程

目录
一、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:
composer require "swoole/swoole-src":"~4.0" 1.2 创建一个简朴的TCP服务器

        创建一个名为server.php的文件,并写入以下代码:
<?php

$server = new Swoole\Server("***.*.*.*", 9501);

$server->on("Start", function ($server) {

    echo "Server is started.\n";

});

$server->on("Receive", function ($server, $fd, $reactor_id, $data) {

    $server->send($fd, "Server: " . $data);

});

$server->start();         运行server.php启动服务器:
php server.php 1.3 创建客户端连接服务器

        创建一个名为client.php的文件,并写入以下代码:
<?php

$client = new Swoole\Client(SWOOLE_SOCK_TCP);

if (!$client->connect('***.*.*.*', 9501, 0.5)) {

    echo "Connect failed\n";

    exit;

}

for ($i = 0; $i < 10; $i++) {

    $client->send("hello world");

    $ret = $client->recv();

    echo "Received: {$ret}\n";

}

$client->close();         运行client.php连接服务器并发送消息:
php client.php 1.4 异步任务和定时器

        Swoole支持异步任务处理和定时器,可以用来执行耗时操作而不壅闭主服务器进程。以下是一个利用异步任务的示例:
$server->on("Task", function ($serv, $task_id, $src_id, $data) {

    // 异步执行耗时任务

    sleep(1);

    $serv->finish("Task#{$task_id} completed");

});

$server->on("Finish", function ($serv, $task_id, $data) {

    echo "Task#{$task_id} return: {$data}\n";

});

// 在Receive事件中分配异步任务

$server->on("Receive", function ($serv, $fd, $reactor_id, $data) {

    $serv->task($data);

}); 1.5 WebSocket服务器

        Swoole还支持WebSocket协议,可以用来创建及时的双向通信应用。以下是一个简朴的WebSocket服务器示例:
$server = new Swoole\WebSocket\Server("*.*.*.*", 9502);

$server->on("open", function ($server, $request) {

    $server->push($request->fd, "hello, welcome\n");

});

$server->on("message", function ($server, $frame) {

    echo "Message: {$frame->data}\n";

    $server->push($frame->fd, "server: {$frame->data}");

});

$server->on("close", function ($ser, $fd) {

    echo "client#{$fd} is closed\n";

});

$server->start();         以上是Swoole的基础利用教程,涵盖了创建TCP服务器、客户端、异步任务和WebSocket服务器的基本步调。Swoole功能非常强大,发起深入阅读官方文档和示例来把握更多高级特性。
二、Swoole高级功能

2.1 异步MySQL查询

        Swoole支持异步MySQL客户端,可以在不壅闭主服务器进程的情况下执行数据库查询。这对于必要频繁访问数据库的应用来说非常有用。
$server = new Swoole\Server("127.0.0.1", 9501);

$server->on('start', function ($server) {

    echo "Swoole server is started at http://127.0.0.1:9501\n";

});

$server->on('receive', function ($server, $fd, $from_id, $data) {

    // 异步查询数据库

    $db = new Swoole\Coroutine\MySQL();

    $server->defer(function () use ($db) {

        $db->close();

    });

    $db->connect([

        'host' => '127.0.0.1',

        'user' => 'your_user',

        'password' => 'your_password',

        'database' => 'test',

        'charset' => 'utf8',

    ]);

    $sql = "SELECT * FROM your_table WHERE id = ?";

    $stmt = $db->prepare($sql);

    $result = $stmt->execute();

    if ($result) {

        $row = $stmt->fetch();

        $server->send($fd, json_encode($row));

    } else {

        $server->send($fd, "Error: " . $db->error);

    }

});

$server->start();         留意:上面的代码示例利用了Swoole的协程MySQL客户端,它必要在Swoole 4.1.0 或更高版本中启用协程支持。`$server->defer` 用于确保在协程结束时关闭数据库连接。
2.2 利用Swoole Table进行高效内存数据共享

        Swoole Table 是一个基于共享内存的高性能数据结构,实用于存储必要频繁访问和更新的数据,如在线用户列表、会话信息等。
$table = new Swoole\Table(1024);

$table->column('fd', Swoole\Table::TYPE_INT);

$table->column('username', Swoole\Table::TYPE_STRING, 32);

$table->create();

$server = new Swoole\Server("127.0.0.1", 9501);

$server->on('start', function ($server) use ($table) {

    echo "Swoole server is started.\n";

});

$server->on('connect', function ($server, $fd) use ($table) {

    // 假设在连接时设置用户名为"user$fd"

    $table->set($fd, ['fd' => $fd, 'username' => "user$fd"]);

});

$server->on('receive', function ($server, $fd, $from_id, $data) use ($table) {

    $userInfo = $table->get($fd);

    echo "Received data from {$userInfo['username']}: {$data}\n";

});

$server->start();         留意:上面的代码示例仅用于演示怎样在连接变乱中设置Swoole Table,并在接收数据时读取它。在实际应用中,您大概必要更复杂的逻辑来处理用户认证和数据验证。
2.3 HTTP服务器

        Swoole也支持HTTP服务器,可以直接处理HTTP哀求而不必要Nginx或Apache等外部Web服务器。
$http = new Swoole\Http\Server("127.0.0.1", 9501);

$http->on('request', function ($request, $response) {

    $response->header('Content-Type', 'text/plain');

    $response->end("Hello Swoole\n");

});

$http->start();         这个简朴的HTTP服务器会对所有哀求返回"Hello Swoole"的响应。
2.4 WebSocket通信

        WebSocket提供了一种在单个TCP连接上进行全双工通信的方式,非常适合及时应用,如谈天室、及时通知等。Swoole的WebSocket服务器可以很容易地集成到现有的Swoole服务器中。
$server = new Swoole\WebSocket\Server("127.0.0.1", 9502);

$server->on("open", function ($server, $request) {

    echo "New connection: {$request->fd}\n";

});

$server->on("message", function ($server, $frame) {

    echo "Received message: {$frame->data}\n";

    $server->send($frame->fd, "Server: {$frame->data}");

});

$server->on("close", function ($server, $fd) {

    echo "Connection closed: {$fd}\n";

});

$server->start();         在这个例子中,我们创建了一个WebSocket服务器监听在本地的9502端口。当有新的WebSocket连接打开时,会触发`open`变乱;当收到客户端发送的消息时,会触发`message`变乱;当连接关闭时,会触发`close`变乱。
2.5 异步任务

        Swoole提供了异步任务处理的能力,允许你在不壅闭主变乱循环的情况下执行耗时的操作。这对于执行数据库查询、文件操作等任务非常有用。
$server = new Swoole\Server("***.*.*.*", 9503);

$server->on("request", function ($request, $response) {

    $task_id = $server->task([

        'action' => 'heavy_computation',

        'data' => $request->post

    ]);

    $response->end("Task ID: {$task_id}\n");

});

$server->on("task", function ($server, $task_id, $src_worker_id, $data) {

    // 模拟耗时操作

    sleep(1);

    $result = "Result of {$data['action']}";

    // 将结果返回给worker进程

    $server->finish($result);

});

$server->on("finish", function ($server, $task_id, $data) {

    echo "Task #{$task_id} finished: {$data}\n";

});

$server->start();         在这个例子中,我们创建了一个HTTP服务器,当接收到哀求时,它会将一个任务异步地发送到任务队列。然后,它会立即返回一个响应给客户端,告诉它任务ID。在后台,一个worker进程会处理这个任务,并在完成后将结果返回给服务器。
        通过这些示例,我们可以看到Swoole在构建高性能、异步、并行的PHP应用方面的强大能力。无论是WebSocket通信、异步任务处理,还是内存数据共享,Swoole都提供了丰富的功能来满意各种复杂场景的需求。
        Swoole是一个功能强大的工具,以上只是其浩繁功能中的一小部门。为了充分利用Swoole,发起深入阅读其官方文档和社区资源。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【后端】Swoole利用教程