【后端】Swoole使用教程
通过这些示例,我们可以看到Swoole在构建高性能、异步、并行的PHP应用方面的强大能力。无论是WebSocket通信、异步任务处理,还是内存数据共享,Swoole都提供了丰富的功能来满足各种复杂场景的需求。
目录
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,建议深入阅读其官方文档和社区资源。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)