服务器cli模式下的定时器
有时候需要一部分后台业务异步的处理,比如处理redis队列啊,处理mysql统计啊,数据同步啊,这种长时间任务,但是又需要每段时间去看看的,发现linux cron最小只能支持每分钟的任务
分 时 天 月 星期
这颗粒度太大了,而我们实际业务往往需要几秒一次的查询或者每秒一次的业务,甚至有时候是毫秒级别的任务。
于是干脆写个后台一直运行的程序一直监控着。
最简单的方法使用 php while 死循环
<?php
while (1) {
}
发现这样CPU马上跑满了,这样消耗CPU太厉害也不行,然后给它休息一下也行
<?php
while (1) {
usleep(1000);
}
每次1毫秒一次 这样其实CPU也消耗的不太高 百分之2-3左右吧
如果每1秒一次的话,几乎消耗的就不多了,百分之0.几
<?php
while (1) {
sleep(1);
}
对于php开发者而言这也不错。
然后想想要不试试lua 发现lua 也有很多不同的方案。
首先可以尝试 while 死循环
while(1)
do end
CPU都百分之130了,太可怕
然后加个休息 每秒休息一次
while(1)
do
os.execute("sleep " .. 1)
end
发现这样就压根不占用CPU啊!不过然后发现这个时间是秒级别,换个毫秒级别的
local socket_now = require('socket')
while(1)
do
socket_now.select(nil, nil, 0.001)
end
这个就是1毫秒一次了 占用CPU 百分之3-4 也还不错。
当然完全也可以用swoole的那种定时器,不过感觉那还得搞swoole,得有学习成本,对很多公司的fpm模式而言,有时候只有几个业务是后台常驻需要弄个定时器的,这样也就足够了,简单好维护。
这里面的业务代码,可以使用redis或者文件缓存等方式,看看是不是有任务,简单迅速的查询是不是需要处理,需要就处理,给开始处理业务上一个锁,避免长时间没执行完,后面的循环又压上来了造成业务执行第二次,有锁了就不做处理等待sleep。
当然也有可能锁出现问题,一直锁住 导致业务一直无法继续,那就给它加一个过期时间,当锁自然过期后,最终还是能执行进来的,毕竟这程序在一直循环。
<?php
while(1)
{
$check_flag = check_if_we_have_task_in_redis_or_cache();
if ($check_flag)
{
add_a_lock_for_flag();
handle_task();
}
usleep(1000);
}
服务器cli模式下的定时器的更多相关文章
- php cli模式下获取参数的方法
转载声明:http://blog.csdn.net/fdipzone/article/details/51945892 php在cli模式下接收参数有两种方法 1.使用argv数组 <?php ...
- php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数
在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...
- PHP CLI模式下的多进程应用
作者: Laruence( ) 本文地址: http://www.laruence.com/2009/06/11/930.html 转载请注明出处 PHP在很多时候不适合做常驻的SHELL进程, ...
- PHP CLI模式下echo换行
近日在执行导库程序的时候,需要在CLI模式下运行程序进行调试,如下图,这是什么鬼?不是我想要的结果 后经过查资料发现代码中执行的输出为 //错误方法实例 echo '其他-683\n'; //正确打开 ...
- PHP CLI模式下的多进程应用分析
PHP在非常多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以假设用PHP做常驻SHELL, 你会常常被内存耗尽导致abort而unhappy 并且, 假设 ...
- 解决 php7 cli 模式下中文乱码的两中方法
解决 php7 cli 模式下中文乱码的两中方法1. 给PHP文件开头加上 exec('chcp 936'); 然后把该文件以 ANSI 格式编码2. 在 php.ini 中设置 default_ch ...
- 解决方案-Jmeter在CLI模式下无法生成html报告文件
出错场景: 在CLI模式下运行jmeter,将 jtl 结果转为 html 报告时,提示An error occurred: Data exporter "html" is una ...
- php CLI 模式下的传参方法
在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...
- Php cli模式下执行报错/usr/bin/php: /usr/local/lib/libxml2.so.2: no version information available (required by /usr/bin/php)
centos下php cli模式报错 /usr/bin/php: /usr/local/lib/libxml2.so.2: no version information available (requ ...
- 服务器 vim模式下报错E37: No write since last change (add ! to override)
故障现象: 使用vim修改文件报错,系统提示如下: E37: No write since last change (add ! to override) 故障原因: 文件为只读文件,无法修改. 解决 ...
随机推荐
- ZeroTier 内网穿透
之前使用 FRP 进行内网穿透,缺点是需要公网 IP,而没有公网 IP 的我只好租了一台云服务器来作为 FRP Server.花钱不说,公网这台云服务器的带宽还很小,导致内网穿透体验并不怎么样.Zer ...
- LaTeX 插入矢量图
首先将矢量图保存为 PDF 格式. 使用 pdfcrop 工具裁剪 PDF 页面空白: pdfcrop <input.pdf> [output.pdf] 在 .tex 文件中使用 grap ...
- 【Docker教程系列】Docker学习5-Docker镜像理解
通过前面几篇文章的学习,我们已经安装好了Docker,也学会使用一些常用的命令.比如启动命令.镜像命令.容器命令.常用命令分类后的第二个就是镜像命令.那么镜像是什么?拉取镜像的时候为什么是一层一层的? ...
- keycloak~scope客户端模板的使用
scope为何物? scope在oauth2中表示授权的范围,另外也可以理解为,根据认证时scope的参数,在构建jwt时,返回更多的信息:比如在keycloak中,你的可选scope(optiona ...
- CSS – Design System
介绍 这篇 Tailwind CSS 的教程:Translating a Custom Design System to Tailwind CSS 充分的体现了什么是 Design System. 设 ...
- 全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数
全网最适合入门的面向对象编程教程:48 Python 函数方法与接口-位置参数.默认参数.可变参数和关键字参数 摘要: 在 Python 中,函数可以接受多种不同类型的参数,包括位置参数.默认参数.可 ...
- 浅谈数栈产品里的 Descriptions 组件
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 What's? 数栈产品里的 Description ...
- Vue Cli 创建项目在 GitHub 部署 history 路由模式
1.修改打包路径 在 vue.config.js 中添加 publicPath 配置,其中 teambition-vue 是你项目的 github 名字.否则会找不到资源. module.expo ...
- PHP中几种常见的开发模式
设计模式 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义 getInstance()方法必须设置为公有的,必须 ...
- 使用KFold交叉验证方法划分训练集和验证集
在进行深度学习时,为了提高精度,或者为了评估我们模型的优劣,以及如何选择一个更好的模型.这样我们就需要用到交叉验证方法. 我们主要实现如何使用KFold划分训练集和验证集 #coding:utf-8f ...