首页 > 系统相关 >在 PHP 中,原生并没有提供内置的定时器机制,定时触发的守护进程,其中一个常见的方式是使用循环和时间戳来检查触发时间。自定义事件触发

在 PHP 中,原生并没有提供内置的定时器机制,定时触发的守护进程,其中一个常见的方式是使用循环和时间戳来检查触发时间。自定义事件触发

时间:2023-08-28 11:27:03浏览次数:37  
标签:fp 触发 log 自定义 fclose 进程 PHP 守护

<?php
class TimerDaemon
{
    private $logfile;
    private $fp;
    private $triggerInterval; // 触发间隔,以秒为单位
    private $lastTriggerTime;

    public function __construct($logfile, $triggerInterval)
    {
        $this->logfile = $logfile;
        $this->triggerInterval = $triggerInterval;
        $this->lastTriggerTime = time();
    }

    public function run()
    {
        // 脱离终端并在后台运行
        if (php_sapi_name() !== 'cli') {
            die("This script must be run from the command line.");
        }

        // 创建子进程
        $pid = pcntl_fork();

        if ($pid === -1) {
            die("Could not fork.");
        } elseif ($pid) {
            // 父进程退出
            exit();
        }

        // 设置子进程为会话领导者
        if (posix_setsid() === -1) {
            die("Could not set session leader.");
        }

        // 更改工作目录到根目录
        chdir('/');

        // 关闭标准输入、输出和错误描述符
        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);

        // 打开日志文件作为输出
        $this->fp = fopen($this->logfile, 'a');

        // 主要的守护进程逻辑
        while (true) {
            $currentTime = time();
            if ($currentTime - $this->lastTriggerTime >= $this->triggerInterval) {
                $this->trigger();
                $this->lastTriggerTime = $currentTime;
            }

            // 守护进程的其他工作代码
            $this->log("Daemon is running...");

            // 休眠一段时间
            sleep(1);
        }

        // 关闭日志文件
        fclose($this->fp);
    }

    private function log($message)
    {
        fwrite($this->fp, $message . "\n");
        fflush($this->fp);
    }

    private function trigger()
    {
        // 在这里实现你的自定义事件触发逻辑
        // 例如:发送邮件、执行任务等
        $this->log("Triggered at: " . date('Y-m-d H:i:s'));
    }
}

// 创建 TimerDaemon 实例并运行
$daemon = new TimerDaemon('/path/to/daemon.log', 60); // 触发间隔为60秒
$daemon->run();

在上述示例中,TimerDaemon 类实现了一个每隔指定时间触发一次事件的守护进程。根据需要设置触发间隔和实现自己的触发逻辑。

虽然这种方法可以满足一些简单的定时触发需求,但在更复杂的情况下,可能需要考虑使用专业的定时任务管理工具

标签:fp,触发,log,自定义,fclose,进程,PHP,守护
From: https://www.cnblogs.com/zxingduo/p/17661804.html

相关文章

  • js自定义事件
    新建js新建自定义事件方式有两种:1.newEvent('myEvent',initEvent)2.newCustomEvent('myEvent',initEvent)//newCustomEvent('myEvent',{detail:{name:'yejingxiao'}})相同点简单的自定义事件Event,CustomEvent都可以用,且第二个参数都是可选非必填参数,用以配置常见......
  • WPF-封装自定义雷达图控件
     源码地址:https://gitee.com/LiuShuiRuoBing/code_blog雷达图用于表示不同内容的占比关系,在项目中有广泛的应用,但是目前未曾有封装良好的雷达图控件,鉴于最近项目的使用,于是想要封装一个通用的雷达图控件,便于日后的扩展使用。首先雷达图的绘制大概分为雷达图的图层、......
  • 前端歌谣的刷题之路-第五题-自定义列表
     目录前言题目核心代码总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网题......
  • React加载组件后自动触发某函数,而不需要点击按钮
    问题在项目中使用了ReactToPrint来实现打印,但是trigger属性中的按钮需要点击才能执行打印。期望能在组件加载完成时自动执行打印方法。解决可在组件加载完成时,通过id获取组件,并执行该组件的click方法。代码如下:importReact,{useRef,useEffect}from'react';//.........
  • django(Ajax、自定义分页器、form组件)
    一、Ajax1概述异步提交局部刷新例子:github注册动态获取用户名实时的跟后端确认并实时展示到前端(局部刷新)朝后端发送请求的方式1.浏览器地址栏直接输入url回车GET请求2.a标签href属性GET请求3.form表单GET......
  • [极客大挑战 2019]PHP
    [极客大挑战2019]PHP打开链接,提示有备份网站的习惯![image-20230821164500785](../../../../../../Typora文章/[极客大挑战2019]PHP/image-20230821164500785.png)因此此时尝试访问一些常见的网站备份文件名,例如:常见网站源码备份文件后缀:tar.gz zip rar tar常见网站源......
  • 自定义注解实现日志打印
    首先什么是自定义注解?自定义注解是Java语言提供的一种机制,允许程序员定义自己的注解类型。注解是源代码级别的元数据,可以提供额外的信息给编译器、解析工具和运行时环境。下面是创建自定义注解的一般步骤:使用@interface关键字定义注解类型,注解类型名通常以@作为前缀,如@MyAnnotation......
  • Struts2的自定义类型转换和简单的输入校验
    这里关键是对自定义类型的理解,它和8个基本数据类型的地位是一样的,只不过这个是你自己定义的类型。那么在Struts2中什么时候要用到数据类型转换呢?其实,我们一直在用,只是我们没有感觉到而已,Struts2对8个基本数据类型以及Date、String等常见类型,会自动的用内建的类型转换器进行转换,这个......
  • 标题:在Godot中使用Node2D创建自定义的Label
    在Godot游戏引擎中,我们经常需要在游戏中显示文本信息。通常,我们可以使用Label节点来实现这一点。但是,在某些情况下,你可能希望更灵活地控制文本的显示和样式。在本篇博客中,我们将学习如何通过使用Node2D节点来创建一个自定义的Label,从而能够更好地控制文本的呈现方式。效果图步......
  • js_中文输入法情况下, 输入框v-model绑定值中没有输入值但却触发input事件的问题
    中文输入法情况下,输入框v-model绑定值中没有输入值但却触发input事件的问题今天写的一个搜索框,要求输入字符时不作处理,直到用户点击搜索按钮时才执行搜索逻辑;当用户将搜索框文本删除至空字符串时,执行一次无搜索值的搜索逻辑,用于将表格数据恢复至无筛选;在这个功能......