Periodic watcher operation modes
EvPeriodic
watcher works in different modes depending on the
offset
,
interval
and
reschedule_cb
parameters.
-
Absolute timer . In this mode
interval
=0
,reschedule_cb
=NULL
. This time simply fires at the wallclock timeoffset
and doesn't repeat. It will not adjust when a time jump occurs, that is, if it is to be run at January 1st 2014 then it will run when the system time reaches or surpasses this time. -
Repeating interval timer . In this mode
interval
>0
,reschedule_cb
=NULL
; the watcher will always be scheduled to timeout at the nextoffset
+N
*interval
time(for some integerN
) and then repeat, regardless of any time jumps.This can be used to create timers that do not drift with respect to system time:
<?php
$hourly = EvPeriodic(0, 3600, NULL, function () {
echo "once per hour\n";
};
?>3600
seconds in between triggers, but only that the callback will be called when the system time shows a full hour( UTC ).EvPeriodic will try to run the callback in this mode at the next possible time where time =
offset
( modinterval
), regardless of any time jumps. -
Manual reschedule mode . In this mode
reschedule_cb
is a callable .interval
andoffset
are both being ignored. Instead, each time the periodic watcher gets scheduled, the reschedule callback (reschedule_cb
) will be called with the watcher as first, and the current time as second argument.This callback must not stop or destroy this or any other periodic watchers, ever, and must not call any event loop functions or methods. To stop it return
1e30
and stop it afterwards. An EvPrepare watcher may be used for this task.It must return the next time to trigger, based on the passed time value (that is, the lowest time value larger than or equal to the second argument). It will usually be called just before the callback will be triggered, but might be called at other times, too.
Example #1 Using reschedule callback
<?php
// Tick each 10.5 seconds
function reschedule_cb ($watcher, $now) {
return $now + (10.5. - fmod($now, 10.5));
}
$w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
echo time(), PHP_EOL;
});
Ev::run();
?>
English translation
You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.
Thank you in advance.
Document created the 30/01/2003, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/php-rf-ev.periodic-modes.html
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.
References
These references and links indicate documents consulted during the writing of this page, or which may provide additional information, but the authors of these sources can not be held responsible for the content of this page.
The author This site is solely responsible for the way in which the various concepts, and the freedoms that are taken with the reference works, are presented here. Remember that you must cross multiple source information to reduce the risk of errors.