目录

一、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([1]);

    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,建议深入阅读其官方文档和社区资源。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐