<?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