<?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 类实现了一个每隔指定时间触发一次事件的守护进程。根据需要设置触发间隔和实现自己的触发逻辑。

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

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

  1. uniapp仿h5+fire自定义事件触发监听

    仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ...

  2. freemarker 中可以直接使用的内置对象

    freemarker 中可以直接使用的内置对象 需要配置一下:springboot中配置 ## Freemarker \u914D\u7F6E ## \u6587\u4EF6\u914D\u7F6E\ ...

  3. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  4. 在Eclipse+ADT中开发Android系统的内置应用

    转自:  http://www.iteye.com/topic/1050439 在Eclipse+ADT中开发Android系统的内置应用 Android系统内置有:Browser(浏览器).Mms( ...

  5. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控

    摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2.6.更新 ...

  6. js课程 3-9 js内置对象定时器和超时器怎么使用

    js课程 3-9 js内置对象定时器和超时器怎么使用 一.总结 一句话总结:定时器:    1.定义    sobj=setInterval(func,1000);        2.清除    cl ...

  7. JSP中的Java代码和内置对象

    一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...

  8. yii框架中验证器声明一组内置验证器可以使用短名称引用

    1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...

  9. SQLServer中DataLength()和Len()两内置函数的区别(转载)

    最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...

  10. SQLServer中DataLength()和Len()两内置函数的区别

    最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...

随机推荐

  1. 解决STM32 CubeMX中配置RTC每次上电就会重置的问题

    自从有了Cube MX,配置STM32的外设就变得格外简单.不过这次差点踩坑,下载完程序后RTC自动就恢复到了我设置的初始值,重启之后现象依旧. 下面就以上问题简单分析一下代码. /* RTC ini ...

  2. 「V 曲闲谈」《万物与我同归于寂》——终与始

      死亡, 胃酸逆流 失去最初模样 开端与结局颠倒 脉搏也摇晃   于强烈的动机下选定这首歌,但构思时又发觉,一个十六岁的青年,似乎在这个艰涩的哲学问题上难以开口.   那么先来说说我的动机.为什么我 ...

  3. 第一章 Java集合框架

    ----------------------------------------------------------------------------- Java集合框架(一)-ArrayList ...

  4. Qml 中实现任意角为圆角的矩形

    [写在前面] 在 Qml 中,矩形(Rectangle)是最常用的元素之一. 然而,标准的矩形元素仅允许设置统一的圆角半径. 在实际开发中,我们经常需要更灵活的圆角设置,例如只对某些角进行圆角处理,或 ...

  5. 为什么UNIX使用init进程启动其他进程?

    为什么UNIX使用init进程启动其他进程? 在UNIX系统中,当系统启动时,内核完成初始化后会启动第一个用户空间进程,通常是init进程.init进程负责启动和管理其他用户空间进程,而内核本身并不直 ...

  6. 关于hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn't found异常

    在Spring中使用断路器后可能会遇到:com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fall ...

  7. 无线路由器dBi越大越好吗?

    无线路由器dBi越大越好吗? 目前,常见的无线路由器,通过查看参数可知,大多为3dBi.5dBi或7dBi,对于用户来说,这个数值到底是越大越好,还是越小越好呢?对于这个问题,其实通过下面这张天线增益 ...

  8. 【博客搭建】Hexo使用笔记

    [博客搭建]Hexo 使用笔记 Hexo 是一款前端博客框架,可以自动根据基于 Markdown 的文章生成博客网站代码. 基本概念 项目结构 目录 描述 _config.yml 网站的配置信息 th ...

  9. 4个Sprint目标的挑战以及解决的技巧

    1. Sprint 目标太大 有时,您的团队可能会尝试将过多的任务塞进冲刺中.抵制在冲刺中承担太多的诱惑,因为这会损害你的速度和持续交付的能力. 2. Sprint目标是模糊的 冲刺目标通常是不确定的 ...

  10. JS ellipse 转 PathData

    绘制Path function ellipse2path(cx, cy, rx, ry, degree) { //cx cy:圆心 //rx ry:x y 轴长 //degree:度数,顺时针方向为正 ...