swoole的安装及使用

Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程、高性能网络编程支持。提供了多种通信协议的网络服务器和客户端模块,可以方便快速的实现 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域。

安装启用

Swoole是PHP的一个扩展,可以通过PHP扩展的方式进行安装和启用(不同于普通的扩展只是提供一个库函数,Swoole扩展在运行后会接管PHP的控制权,进入事件循环,当IO事件发生后底层会自动回调指定的PHP函数)。
如果是在服务器安装的话,以Ubuntu系统为例,通过执行下列命令安装即可:

pecl install swoole

然后通过 php -i | grep php.ini 定位php.ini文件所在位置,并打开该配置文件,在文件末尾追加如下内容:

[swoole]
extension=swoole.so

保存并退出,在终端运行php -m,如果看到扩展里包含swoole,说明安装启用成功。

HTTP 服务器 首先我们通过Swoole编写一个简单的HTTP服务器,在测试目录下创建一个http_server.php文件,编写文件代码如下:

<?php
// 表明服务器启动后监听本地 9051 端口
$server = new swoole_http_server('127.0.0.1', 9501);

// 服务器启动时返回响应
$server->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501\n";
});

// 向服务器发送请求时返回响应
// 可以获取请求参数,也可以设置响应头和响应内容
$server->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World\n");
});

// 启动 HTTP 服务器
$server->start();

这样,一个最基本的 HTTP 服务器就完成了,其工作原理和工业级的 Apache 和 Nginx 服务器类似,只不过提供的是最简单的服务器监听和响应功能罢了,我们在终端启用这个服务器:

ab8f1796dc25a583c353f7dc3298de9f_1182x94.jpg

这样,表示服务器已经启动并且在监听请求了,到浏览器中访问http://127.0.0.1:9501,即可获取服务器输出响应内容:

8b2710000cd240a5eaac9c8f6956fb3b_968x340.jpg

TCP服务器和客户端

接下来,我们通过Swoole及其协程特性实现一个简单的TCP服务器和客户端(TCP 协议需要双方通过三次握手建立连接后才能进行通信),我们还是在前面的测试目录下创建一个tcp_server.php文件用于编写 TCP 服务端代码:

<?php
namespace Swoole;

// 监听本地 9503 端口,等待客户端请求
$server = new Server("127.0.0.1", 9503);
// 建立连接时输出
$server->on('connect', function ($serv, $fd){
    echo "Client:Connect.\n";
});
// 接收消息时返回内容
$server->on('receive', function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, 'Swoole: '.$data);
    $serv->close($fd);
});
// 连接关闭时输出
$server->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});
// 启动 TCP 服务器
$server->start();

然后在该目录下创建一个tcp_client.php文件用于编写 TCP 客户端代码:

<?php
namespace Swoole;

// Swoole4以后通过协程来实现异步通信
go(function () {

    $client = new Coroutine\Client(SWOOLE_SOCK_TCP);
    // 尝试与指定 TCP 服务端建立连接(IP和端口号需要与服务端保持一致,超时时间为0.5秒)
    if ($client->connect("127.0.0.1", 9503, 0.5)) {
        // 建立连接后发送内容
        $client->send("hello world\n");
        // 打印接收到的消息
        echo $client->recv();
        // 关闭连接
        $client->close();
    } else {
        echo "connect failed.";
    }
});

这样,一个最基本的 TCP 服务端和客户端程序就编写完成了,在终端先启动 TCP 服务端:

php tcp_server.php

然后新开启一个终端窗口,启动 TCP 客户端,可以看到输出从 TCP 服务端接收到消息后 TCP 客户端退出,此时服务端也会打印连接建立和断开的日志消息:

8d27d00d62c2c59a1c53a4fb29210c6b_1066x122.jpg

客户端退出后,服务端依然处理监听状态,等待下一个请求。

注:进程是应用程序的启动实例,拥有代码和打开的文件资源,数据资源,独立的内存空间;
线程是程序的执行者,一个进程至少包含一个主线程,也可有更多的子线程,线程有分时调度,抢占式调度两种调度策略;
协程是轻量级线程,它的创建、切换、挂起、销毁全为内存操作,消耗非常低。
协程在线程里执行,由用户手动切换调度【用户空间线程】,其调度策略是协作式调度。

本文转自:Swoole扩展安装与使用入门

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论