【发布时间】:2019-01-10 23:44:57
【问题描述】:
老读者,第一次发帖……
我在 Ubuntu 16.04 机器上托管了一个长期运行的 PHP 7 进程。它以不同的间隔执行多种功能;每 2m 一次,一些曾经 15m 等。我根据当前纪元时间触发这些函数,比较为每个函数维护的“next_time_to_run”。每次执行函数时都会重新计算 next_time_to_run。例如,如果一个函数每 2 分钟执行一次,那么当它被触发时,它只需将当前 epoch 时间加 120 即可找到下一个触发时间。
我最近遇到了一个问题,即 NTP 进程在我的进程运行时显着改变了系统时间。正如你可能想象的那样,这让我的日程安排变得一头雾水。 (哦,是的,我说'tizzy')
我的问题是——是否可以注册回调/事件处理程序/等。当系统时间(纪元)改变时会被触发吗?顺便说一句,系统时钟保持在 UTC。
感谢 oh-great-and-glorious-StackOverflow-hive-mind!
$dothing1time = time() + 120;
$dothing2time = time() + 3600;
while(1) {
$now = time();
if( $now >= $dothing1time ) { dothing1(); $dothing1time = $now + 120; }
if( $now >= $dothing2time ) { dothing2(); $dothing2time = $now + 3600; }
sleep( 30 );
}
【问题讨论】:
-
最丑陋和快速的解决方案:1) 禁用 ntp 守护进程,2) 每天(每周/每月)检查一次长脚本中的时间 2) 直接从脚本启动 ntp 更新 3) 检查时间再找差异
-
没有内置的时间变化通知机制。我只是将函数拆分为单独的命令,并使用自己的 cron 运行每个命令——完全消除了代码中的所有时间管理。
-
取决于您是否只想probe for adjustements 或需要real notifications(即使使用 FFI 在 PHP 中也不可能)。真正的问题是为什么这个长时间运行的脚本会实现延迟。多个 cron 作业不是更简单吗?
-
这些功能确实需要与“现实世界”保持同步,因此禁用 NTP 是不可行的。也许偶尔运行它。
-
还有更多的定时函数在运行,它会监控其他“东西”,因此以 cron 方式运行并不实用(某些函数需要与其他函数协调,等等)