swoole毫秒定时器讲解以及实战详细分析

本文分享一个自己使用swoole毫秒定时器遇过的坑,以及解决的方法。希望能帮助遇到大家。

学习毫秒定时器前,需要具备使用的基础语法,请参考官方文档(https://wiki.swoole.com/#/timer),我就不照搬了。

其中使用毫秒定时器的注意事项要多注意一下,以防后面犯错都不知道啥原因

1. 定时器仅在当前进程空间内有效
2. 定时器是纯异步实现的,不能与同步 IO 的函数一起使用,否则定时器的执行时间会发生错乱
3. 定时器在执行的过程中可能存在一定误差

相信大家在看swoole的毫秒定时器时,跟着官方基础的例子都会写。但用到实际项目中,要怎么结合呢?下面就开始分享一下我自己在实际项目中使用swoole定时器的方式。

我们以think5.1框架为例子,比如在某个控制器中,使用毫秒定时器根据官方文档,写出这么一个例子。

public function test()
{
    $param1 = 'aaa';
    $path = __DIR__.'/demo.txt';
    //每隔两秒往demo.txt文件写一次数据,用此例子代替业务逻辑
    swoole_timer_tick(2000,function () use ($param1, $path) {
        file_put_contents($path,$param1.'|'.'1'.PHP_EOL,FILE_APPEND);
    });
}

你们觉得有问题吗?

马上运行看看

讲解一下运行方式:我们都知道swoole运行在cli方式下,直接通过浏览器访问这个方法,肯定会报错。报swoole只能运行在cli方式下。那我们要在cli下如何运行呢?在thinkphp中,我们就可以在入口文件处,以下面的方式运行swoole。
php index.php api/task/test
api/task/test tp中访问方式:模块名/控制器名/方法名

swoole毫秒定时器讲解以及实战详细分析_第1张图片

发现报错.
这个错误我当初百度谷歌了半天,没搞懂。经过询问官方作者后,得以解决.
需要在程序末尾加这么一段代码

`public function test()

{
    $param1 = 'aaa';
    $path = __DIR__.'/demo.txt';
    //每隔两秒往demo.txt文件写一次数据,用此例子代替业务逻辑
    swoole_timer_tick(2000,function () use ($param1, $path) {
        file_put_contents($path,$param1.'|'.'1'.PHP_EOL,FILE_APPEND);
    });
    \Swoole\Event::wait();
}`

swoole毫秒定时器讲解以及实战详细分析_第2张图片

因为定时器是异步的,执行完定时器后,会继续往下执行,而下面没有代码程序就结束了。所以在加一个wait操作,使程序阻塞在那里。这样定时器在两秒后才能继续执行,不会报错。

联想:
而在swoole\server的onWorkerStart方法中使用定时器,为啥不用加wait操作,是因为在server->start操作中,其实就加了wait操作。swoole底层处理了,让程序一直阻塞在start方法中。

加上后,再次运行
swoole毫秒定时器讲解以及实战详细分析_第3张图片

发现不报错了,查看文件也是有数据的,此时成功了一大半了。
swoole毫秒定时器讲解以及实战详细分析_第4张图片

此时发现程序一直占用着终端。如果我们ctrl + c,退出定时器就退出了,我们的业务逻辑就不执行了,这时又来了一个问题,如果定时器能在变成守护进程,一直在后台运行就好了。

如何变成后台运行的方式呢?分享两个我的做法。

1.使用nohup命令(linux自带命令)。不挂断的执行某个命令

nohup /usr/local/php/bin/php index.php api/task/test >/dev/null 2>&1 &

解释:在后台不间断的运行命令(/usr/local/php/bin/php index.php api/task/test),并把运行中的输出重定向到linxu的/dev/null(黑洞文件),2>&1是标准化输出。 & 是nohup的命令要求。
这样子,就可以把脚本变成守护进程运行了。如下图,就不会霸占光标以后台的方式一直运行了
swoole毫秒定时器讲解以及实战详细分析_第5张图片

2.使用superviosr工具
1.可以让一些脚本变成守护进程。
2.可以检测进程的情况,在异常退出时自动重启。比如可以检测swoole的守护进程是否异常退出
把脚本当成一个子进程,被superviosr管理。
区别:比如容错率比nohup要好一点,适合业务逻辑比较重要的场景。直接使用nohup比较方便,不用再去下载superviosr工具,适合边缘化一点业务场景。
image.png
在此文中就不细讲superviosr了,想要了解的可以看看我的另外一篇文章(https://segmentfault.com/a/11...),这里主要是给一个解决问题的方向。

好啦,这样子我们就能愉快的把swoole定时器与实际项目结合啦。
本文为夜雨闻铃原创文章,转载无需和我联系,但请注明文章出处。文章出处:夜雨闻铃的思否文章(https://segmentfault.com/a/11...

你可能感兴趣的:(swoolephplinux)