在 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 类实现了一个每隔指定时间触发一次事件的守护进程。根据需要设置触发间隔和实现自己的触发逻辑。
虽然这种方法可以满足一些简单的定时触发需求,但在更复杂的情况下,可能需要考虑使用专业的定时任务管理工具
在 PHP 中,原生并没有提供内置的定时器机制,定时触发的守护进程,其中一个常见的方式是使用循环和时间戳来检查触发时间。自定义事件触发的更多相关文章
- uniapp仿h5+fire自定义事件触发监听
仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ...
- freemarker 中可以直接使用的内置对象
freemarker 中可以直接使用的内置对象 需要配置一下:springboot中配置 ## Freemarker \u914D\u7F6E ## \u6587\u4EF6\u914D\u7F6E\ ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- 在Eclipse+ADT中开发Android系统的内置应用
转自: http://www.iteye.com/topic/1050439 在Eclipse+ADT中开发Android系统的内置应用 Android系统内置有:Browser(浏览器).Mms( ...
- Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2.6.更新 ...
- js课程 3-9 js内置对象定时器和超时器怎么使用
js课程 3-9 js内置对象定时器和超时器怎么使用 一.总结 一句话总结:定时器: 1.定义 sobj=setInterval(func,1000); 2.清除 cl ...
- JSP中的Java代码和内置对象
一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...
- yii框架中验证器声明一组内置验证器可以使用短名称引用
1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...
- SQLServer中DataLength()和Len()两内置函数的区别(转载)
最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...
- SQLServer中DataLength()和Len()两内置函数的区别
最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE ...
随机推荐
- OpenMMLab AI实战营 第六课笔记
OpenMMLab AI实战营 第六课笔记 目录 OpenMMLab AI实战营 第六课笔记 1.什么是语义分割 1.1 语义分割的应用 1.1.1 应用:无人驾驶汽车 1.1.2 应用:人像分割 1 ...
- gRPC编译与字段编号的细节探讨
上次我们专门通过一个简单的HelloWorld示例来了解了gRPC的基本概念和使用方法.今天,我们将继续深入探讨gRPC,重点讨论一些在实际应用中需要特别注意的要点.实际上,gRPC的核心目标是简化远 ...
- [LC1260]二维网格迁移
二维网格迁移 题目描述 给你一个 m 行 n 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动 ...
- 使用R语言查询某物种所有通路及通路内的基因
使用R语言查询某物种所有通路及通路内的基因,这里使用Y书的clusterProfiler包. 这里以人类为例查询所有通路及通路内的基因: library(R.utils) R.utils::setOp ...
- 性能测试工具_nGrinder
1. ngrinder-controller-3.4.3.war 放置到tomcat的webapps目录下:2. 启动tomcat;3. 访问地址: http://localhost:8080/ngr ...
- manim边做边学--动画联动
今天介绍Manim中的动画联动的技巧,在数学动画中,动画联动是常用的功能, 比如讲解平面几何中三角形与圆的位置关系变化,通过动画联动可以让圆沿着三角形的边滚动,或者让三角形的顶点在圆上移动,从而直观地 ...
- Spring Cloud认知学习(一)--Eureka使用、Ribbon使用
Spring Cloud是一个微服务架构,他有多种组件来管理微服务的方方面面.Spring Cloud是用于构建微服务开发和治理的框架的集合. Spring Cloud是最热门的Java技术毋庸置疑. ...
- K8S故障处理:临时设置节点为不可调度(cordon与drain区别)
在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护.升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能. 1.K8s节点驱逐 节点驱逐是指将节点上运 ...
- 富数-AnonymFL
本文学习文章"2022 WAIC|「全匿踪联邦学习」AnonymFL正式发布:破解用户ID暴露难题,实现真正合规可信的隐私计算",记录笔记. 引言 2022年08月26日,富数科技 ...
- openbox每日开机自动切换网络壁纸
目的 利用bing的每日一图, 每天切换壁纸 开干 联网后下载图片 利用networkmanage启动后执行脚本 netafter.sh 文件地址: /etc/NetworkManager/dispa ...