zoukankan      html  css  js  c++  java
  • PHP实现的毫秒定时器,同时解决进程不重复堆积

    定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:
    1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;
    2)配合使用ignore_user_abort()和set_time_limit(),使脚本脱离浏览器运行。前者是利用Linux的特性,和PHP本身没有多大关系,后者使用场景有限,且只能由一次HTTP请求触发该脚本,执行完后退出。那么我们如何使用纯PHP实现纯粹的定时器任务,且能适应认识任务业务需求?

    基于cli模式运行,依赖php扩展 swoole

    因该定时器支持毫秒,时间间隔较小,未来防止进程堆积,做了进程判断,进程存在就本次停止,等待下一次执行。

    
    <?php
    /**
     * 基于swoole 毫秒定时器
     * */
    
    // 当前的运行环境是否是cli模式
    function is_cli()
    {
        return preg_match("/cli/i", php_sapi_name()) ? true : false;
    }
    
    /**
     * 计划任务定时检测master进程是否存在,不存在则启动,以root用户运行
     * shell基本命令
     *(1)ps aux    显示系统全部进程,一行一个
     *(2)grep “abc” 从标准输入读取字符流,输出包含字符串“abc”的行
     *(3)grep -v "acb"   从标准输入读取字符流,输出不包含字符串“grep”的行
     *(4)wc -l        从标准输入读取字符流,输出行数
     *
     * */
    function checkMaster()
    {
        $cmd = 'ps axu | grep "consume" | grep -v "grep" | wc -l';
        $ret = shell_exec("$cmd");
        $ret = rtrim($ret, "
    ");
        echo "查看进程:".$ret."===". $cmd . "
    ";
        return $ret;
    }
    
    if (is_cli()) {
    
        swoole_timer_tick(2000, function () {
    
            // 判定进程是否存在
            $ret = checkMaster();
            if ($ret === "0") {
               
                $start_master_cmd = "/usr/bin/php /var/www/html/cctv/Html/index.php /Home/TaskSi/consume.html >> /var/www/html/cctv/Runtime/Logs/huisu_si.log &";
                
                $ret = shell_exec("$start_master_cmd");
                // var_dump($ret);
                echo '开启进程:' . $start_master_cmd . "
    ==============================
    ";
            } else {
                echo "进程已存在~~休息一下~~(".$ret.")
    ==============================
    ";
            }
        });
    } else {
        exit("非cli模式,已经停止执行!
    ");
    }
    
    

    原文地址:https://segmentfault.com/a/1190000016457180

  • 相关阅读:
    无锁队列的实现 | 酷壳 CoolShell.cn
    简明 Vim 练级攻略 | 酷壳 CoolShell.cn
    分享:lucene 的评分机制
    JS实现面向对象的设计
    EF架构~性能高效的批量操作(Update篇)
    将不确定变为确定~transactionscope何时提升为分布式事务?
    将不确定变为确定~Linq to SQL不能随机排序吗?
    vs2012~ 开发人员的福音
    白领职场必懂的22条潜规则(转载)
    经典面试题(转载)
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9970103.html
Copyright © 2011-2022 走看看