目录
一、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启动服务器:
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连接服务器并发送消息:
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,发起深入阅读其官方文档和社区资源。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |