资讯专栏INFORMATION COLUMN

Swoole笔记(三)

wua_wua2012 / 2734人阅读

摘要:服务器里直接运行启动即可。包含了客户端发来的数据帧信息使用获取获取数据内容使用向客户端发送消息。长度最大不得超过。使用,通过几行代码即可写出一个异步非阻塞多进程的服务器里使用运行。

WebSocket

使用Swoole可以很简单的搭建异步非阻塞多进程的WebSocket服务器。

WebSocket服务器
set(array(
    "daemonize" => false,
    "worker_num" => 2,
));

$server->on("Start", function (swoole_websocket_server $server) {
    echo "Server Start... 
";
    swoole_set_process_name("swoole_websocket_server");
});

$server->on("ManagerStart", function (swoole_websocket_server $server) {
    echo "ManagerStart
";
});

$server->on("WorkerStart", function (swoole_websocket_server $server, $worker_id) {
    echo "WorkerStart 
";
    if ($server->worker_id == 0){
        swoole_timer_tick(10000,function($id) use ($server) {
            echo "test timer
";
        });
    }
});

$server->on("Open", function (swoole_websocket_server $server, $request) {
    echo "server: handshake success with fd{$request->fd}
";
});

$server->on("Message", function (swoole_websocket_server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
    $server->push($frame->fd, "this is server");
});

$server->on("Close", function ($ser, $fd) {
    echo "client {$fd} closed
";
});

$server->start();

shell里直接运行php swoole_ws_server.php启动即可。如果设置了后台运行,可以使用下列命令强杀进程:

kill -9 $(ps aux|grep swoole|grep -v grep|awk "{print $2}")

或者重新启动worker进程:

kill -10 $(ps aux|grep swoole_websocket_server|grep -v grep|awk "{print $2}")

输出:

[2017-06-01 22:06:21 $2479.0]    NOTICE    Server is reloading now.
WorkerStart 
WorkerStart 

注意:

onMessage回调函数为必选,当服务器收到来自客户端的数据帧时会回调此函数。

/**
* @param $server
* @param $frame 包含了客户端发来的数据帧信息;使用$frame->fd获取fd;$frame->data获取数据内容
*/
function onMessage(swoole_server $server, swoole_websocket_frame $frame)

使用$server->push()向客户端发送消息。长度最大不得超过2M。发送成功返回true,发送失败返回false。

function swoole_websocket_server->push(int $fd, string $data, int $opcode = 1, bool $finish = true);
WebSocket客户端

最简单的是使用JS编写:

socket = new WebSocket("ws://192.168.1.107:9501/"); 
socket.onopen = function(evt) { 
    // 发送一个初始化消息
    socket.send("I am the client and I"m listening!"); 
}; 

// 监听消息
socket.onmessage = function(event) { 
    console.log("Client received a message", event); 
}; 

// 监听Socket的关闭
socket.onclose = function(event) { 
    console.log("Client notified socket has closed",event); 
}; 

socket.onerror = function(evt) { 
    console.log("Client onerror",event); 
}; 

Swoole里没有直接提供swoole_websocket客户端,不过通过引入WebSocketClient.php文件可以实现:

connect())
{
    echo "connect failed 
";
    return false;
}

$send_data = "I am client.
";
if (!$client->send($send_data))
{
    echo $send_data. " send failed 
";
    return false;
}

echo "send succ 
";
return true;

上面代码实现的是一个同步的swoole_websocket客户端。发送完消息会自动关闭,可以用来与php-fpm应用协作:将耗时任务使用客户端发送到swoole_websocket_server。

如何创建一个聊天室

实际项目里,我们可以将用户uid和fd进行双向绑定(暂不考虑多台服务器分布式部署情况),例如使用Redis保存:在onMessage进行用户信息验证后:

$this->redis->set($fd, $uid);
$this->redis->set($uid, $fd);

后续需要指定给某人发消息,只需要根据uid/fd发送即可。在onClose事件里进行解绑操作。群发的话只需要遍历一遍$server->connections即可。

示例(该项目只实现群发):
moell-peng/webim: PHP + Swoole 实现的简单聊天室
https://github.com/moell-peng...

HttpServer

swoole内置Http服务器的支持。swoole版的http server相对于php-fpm,最大优势在于高性能:代码一次载入内存,后续无需再解释执行。缺点是调试没有nginx+php-fpm方便。

使用swoole,通过几行代码即可写出一个异步非阻塞多进程的Http服务器:

on("Start", function() {
    echo "Start";
});

$serv->on("Request", function($request, $response) {
    var_dump($request->get);
    var_dump($request->post);
    var_dump($request->cookie);
    var_dump($request->files);
    var_dump($request->header);
    var_dump($request->server);

    $response->cookie("User", "Swoole");
    $response->header("X-Server", "Swoole");
    $response->end("

Hello Swoole!

"); }); $serv->start();

shell里使用php swoole_http_server.php运行server。浏览器打开http://192.168.1.107:9502/即可看到输出。

欢迎关注公众号及时获取最新文章推送!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23057.html

相关文章

  • PHP多进程系列笔记(五)

    摘要:消息队列更常见的用途是主进程分配任务,子进程消费执行。子进程前面加了个,这是为了防止父进程还未往消息队列中加入内容直接退出。 前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的swoole_process模块。 swoole多进程 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。 首先,确保安装的swoole...

    qianfeng 评论0 收藏0
  • swoole 学习笔记swoole 真的优秀一个框架

    摘要:所以,我感觉学习,需要一个引导。学习参考链接喵星球特别厉害的一个官网的几个框架文档优势先看一下的结构设计的应用场景的设计项目中引入一个简易的具体参考一篇文章,集合和的简易实例项目中引入结合致敬 前期学完了操作系统,特别是知道了进程,线程 调度的问题。回来看,发现了很多细节。第三次看文档,最初经一个高手朋友的介绍,看swoole,说文档写的贼好。但是看的时候,也是很一头雾水,只知道把de...

    13651657101 评论0 收藏0
  • Swoole笔记(一)

    摘要:修复添加超过万个以上定时器时发生崩溃的问题增加模块,下高性能序列化库修复监听端口设置无效的问题等。线程来处理网络事件轮询,读取数据。当的三次握手成功了以后,由这个线程将连接成功的消息告诉进程,再由进程转交给进程。此时进程触发事件。 本文示例代码详见:https://github.com/52fhy/swoo...。 简介 Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器...

    SHERlocked93 评论0 收藏0
  • swoole 学习笔记

    摘要:安装准备或更高版本或更高版本安装扩展配置支持编辑在其中加入扩展支持服务端代码服务端客户端代码测试代码在命令模式下输入重新再开一个窗口可以用检测如服务端客户端如上,表示服务端启动,客户端连接服务端返回消息,一个闭环形成开发者头条 1.安装准备 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安装swoole扩展 w...

    justCoding 评论0 收藏0
  • Swoole笔记(二)

    摘要:配置了参数后将会启用功能,务必要注册个事件回调函数。周期性定时器一次性定时器清除定时器定时器回调函数注意最大不得超过。进程中不能添加定时器。建议在回调里写定时器。定时器示例防止重复每隔触发一次后执行此函数 本文示例代码详见:https://github.com/52fhy/swoo...。 重新打开日志 在1.8.11及之后版本支持重新打开日志:向Server主进程发送SIGRTMIN...

    jsummer 评论0 收藏0

发表评论

0条评论

wua_wua2012

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<