有时候需要一部分后台业务异步的处理,比如处理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模式下的定时器的更多相关文章

  1. php cli模式下获取参数的方法

    转载声明:http://blog.csdn.net/fdipzone/article/details/51945892 php在cli模式下接收参数有两种方法 1.使用argv数组 <?php ...

  2. php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

    在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...

  3. PHP CLI模式下的多进程应用

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/06/11/930.html 转载请注明出处 PHP在很多时候不适合做常驻的SHELL进程, ...

  4. PHP CLI模式下echo换行

    近日在执行导库程序的时候,需要在CLI模式下运行程序进行调试,如下图,这是什么鬼?不是我想要的结果 后经过查资料发现代码中执行的输出为 //错误方法实例 echo '其他-683\n'; //正确打开 ...

  5. PHP CLI模式下的多进程应用分析

    PHP在非常多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以假设用PHP做常驻SHELL, 你会常常被内存耗尽导致abort而unhappy 并且, 假设 ...

  6. 解决 php7 cli 模式下中文乱码的两中方法

    解决 php7 cli 模式下中文乱码的两中方法1. 给PHP文件开头加上 exec('chcp 936'); 然后把该文件以 ANSI 格式编码2. 在 php.ini 中设置 default_ch ...

  7. 解决方案-Jmeter在CLI模式下无法生成html报告文件

    出错场景: 在CLI模式下运行jmeter,将 jtl 结果转为 html 报告时,提示An error occurred: Data exporter "html" is una ...

  8. php CLI 模式下的传参方法

    在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...

  9. 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 ...

  10. 服务器 vim模式下报错E37: No write since last change (add ! to override)

    故障现象: 使用vim修改文件报错,系统提示如下: E37: No write since last change (add ! to override) 故障原因: 文件为只读文件,无法修改. 解决 ...

随机推荐

  1. java_GUI

    package GUi;import java.awt.*;import static java.awt.Color.red;public class GuI { public static void ...

  2. WKCTF RE

    WKCTF so_easy 安卓逆向,关键的check逻辑都在native层里面 主要是很多层的异或操作 除了Z3和爆破想不到其他方法了 from z3 import * src = [ 0xAE, ...

  3. Spring:基于注解管理bean

    标记与扫描 注解 和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测 到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切 ...

  4. Typora mac激活

    typora mac版本激活 我也是第一次使用mac电脑,在安装时基本上都是付费的,在mac下载使用typora是试用一段时间后是需要付费购买的,苦无能力有限只能绕一下,感谢网上的各位大佬的分享 来源 ...

  5. net core中byte数组如何高效转换为16进制字符串

    在 .NET Core 中,如何把 byte[] 转换为 16 进制字符串?你能想到哪些方法?什么方式性能最好?今天和大家分享几种转换方式. 往往在处理字符串性能问题时,首先应该想到的是怎么想办法减少 ...

  6. C++: 16个基础的C++代码性能优化实例

    前言 近期推动项目屎山代码进行了一波性能优化,实现了较大的性能提升.这里记录了部分近期代码优化的小技巧,这些例子仅从C++语言层面进行优化,主要在于优化类设计.减少隐含函数调用.减少拷贝等,较为基础实 ...

  7. HTML & CSS – Practice Projects

    前言 学完了 w3school 就要练练手了. 这篇是记入我学习的过程, 和知识点. update: 2022-02-27 用文章来表达太难了, 用视频比较合理. 所以我就没有继续写了. 这里记入几篇 ...

  8. C++ 模板(函数模板与类模板)

    模板 模板介绍 C++提供了函数模板(function template).所谓函数模板.实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就称为函数模板. ...

  9. 【YashanDB知识库】如何dump数据文件,转换rowid, 查询对应内容

    本文来自YashanDB官网,具体内容可见https://www.yashandb.com/newsinfo/7459464.html?templateId=1718516 问题现象 客户环境有时候会 ...

  10. map&unordered_map<key,value>key使用自定义类的要求

    std::unordered_map 的键要求: std::unordered_map 是基于哈希表的数据结构. 它要求键类型必须支持哈希计算,也就是必须有对应的 std::hash 函数. 另外,键 ...