博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swoole入门教程04-多端口监听、热重启以及Timer进阶:简单crontab
阅读量:5924 次
发布时间:2019-06-19

本文共 2077 字,大约阅读时间需要 6 分钟。

hot3.png

环境说明: 系统:Ubuntu14.04 (安装教程包括CentOS6.5)

PHP版本:PHP-5.5.10
swoole版本:1.7.7-stable

Github链接:https://github.com/LinkedDestiny/swoole-doc


1.多端口监听

在实际运用场景中,服务器可能需要监听不同host下的不同端口。比如,一个应用服务器,可能需要监听外网的服务端口,同时也需要监听内网的管理端口。在Swoole中,可以轻松的实现这样的功能。 Swoole提供了函数用于给服务器添加一个需要监听的host及port,并指定对应的Socket类型(TCP,UDP,Unix Socket以及对应的IPv4和IPv6版本)。 代码如下:

$serv = new swoole_server("192.168.1.1", 9501); // 监听外网的9501端口$serv->addlistener("127.0.0.1", 9502 , SWOOLE_TCP); // 监听本地的9502端口$serv->start(); // addlistener必须在start前调用

此时,swoole_server就会同时监听两个host下的两个端口。这里要注意的是,来自两个端口的数据会在同一个onReceive中获取到,这时就要用到swoole的另一个成员函数,通过这个函数获取到fd的from_port,就可以判定消息的类型。

$info = $serv->connection_info($fd, $from_id);//来自9502的内网管理端口if($info['from_port'] == 9502) {    $serv->send($fd, "welcome admin\n");}//来自外网else {    $serv->send($fd, 'Swoole: '.$data);}

2.服务器热重启

所谓热重启,就是当服务器相关代码有所变动之后,无需停止服务,而是在服务器仍然运行的状态下更新文件。Swoole通过内置的reload函数以及两个自定义信号量实现了这一功能。 首先我讲解一下Swoole可用的三个信号:SIGTERM,SIGUSR1,SIGUSR2。SIGTERM用于停止服务器,SIGUSR1用于重启全部的Worker进程,SIGUSR2用于重启全部的Task Worker进程。 那要如何实现热更新代码文件呢?Swoole的回调函数中有这个一个回调;该回调会在Worker进程启动时被调用。因此,当swoole_server收到SIGUSR1信号并重启全部Worker进程后,onWorkerStart就会被调用。如果在onWorkerStart中require全部的代码文件,每次onWorkerStart后都会重新require一次php文件,这样就能实现代码文件的热更新。 来看下代码实现:

public function onStart( $serv ) {        cli_set_process_title("reload_master");    }    public function onWorkerStart( $serv , $worker_id) {        require_once "reload_page.php";        Test(); // reload_page.php中定义的一个函数    }

首先,在回调函数中通过php的cli_set_process_title函数设置进程名。 在中,require相关的php文件。 然后,新建一个reload.sh文件,输入如下内容:

echo "Reloading..."cmd=$(pidof reload_master)kill -USR1 "$cmd"echo "Reloaded"

这样,就可以通过执行这个脚本重启服务器了。 

3.Timer补充:after函数

在swoole-1.7.7stable版本中,Timer新增了一个函数。该函数的作用是在指定的时间间隔后执行回调函数,并且只执行一次。 这个函数可以弥补Timer本身做不到或者做起来很难的一些定时工作。 代码如下:

$serv->after( 1000 , array($this, 'onAfter') , $str );

这里指定在1000ms后,执行onAfter回调函数,函数参数为$str。 举个例子,比如服务器要求在收到某个请求后,在30S后向所有用户发起推送。这样的需求就可以直接用after函数来实现。 

4.Timer进阶:简易crontab

未完成,后续会补充更新。(表示用Timer很简单,但是怎么解析Crontab命令完全没头绪……求大神指导……)

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/998304/blog/510845

你可能感兴趣的文章
iOS开发之tintColor属性详解
查看>>
java后台重定向post传参及接受重定向post传参
查看>>
Java 访问 C++ 方法:JavaCPP
查看>>
通讯录表设计
查看>>
android直接读取项目中的sqlite数据库
查看>>
android自动打包方法(ant+proguard+签名)
查看>>
压力测试Jmeter+badboy
查看>>
一个2013届毕业生(踏上IT行业)的迷茫(5)
查看>>
97函数调用的约定
查看>>
Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并
查看>>
axios请求登录失效后阻止其他请求
查看>>
JQuery操纵table
查看>>
MySQL用户管理
查看>>
收藏了8年的PHP优秀资源,都给你整理好了
查看>>
Leetcode题目:Bulls and Cows
查看>>
python全栈_008_Python3 字符编码
查看>>
Java_Hbase Timeout issue
查看>>
odoo开发基础--模型之基本字段类型
查看>>
Ajax在调用含有SoapHeader的webservice方法
查看>>
贴吧爬虫入门
查看>>