mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-18 01:48:55 +00:00

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@328897 c90b9560-bf6c-de11-be94-00142212c4b1
120 lines
4.1 KiB
XML
120 lines
4.1 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<chapter xml:id="ev.periodic-modes" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Periodic watcher operation modes</title>
|
|
|
|
<para>
|
|
<classname>EvPeriodic</classname> watcher works in different modes depending
|
|
on the <parameter>offset</parameter>, <parameter>interval</parameter> and
|
|
<parameter>reschedule_cb</parameter> parameters.
|
|
</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para><emphasis>Absolute timer</emphasis>.
|
|
In this mode <parameter>interval</parameter> = <constant>0</constant>, <parameter>reschedule_cb</parameter> = &null;.
|
|
This time simply fires at the wallclock time <parameter>offset</parameter> and doesn't repeat. It will
|
|
not adjust when a time jump occurs, that is, if it is to be run at <emphasis>January
|
|
1st 2014</emphasis> then it will run when the system time reaches or surpasses this
|
|
time.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para><emphasis>Repeating interval timer</emphasis>.
|
|
In this mode <parameter>interval</parameter> > <constant>0</constant>, <parameter>reschedule_cb</parameter> = &null;;
|
|
the watcher will always be scheduled to timeout at the next <parameter>offset</parameter> + <constant>N</constant> *
|
|
<parameter>interval</parameter> time(for some integer <constant>N</constant>) and then repeat, regardless of any time
|
|
jumps.
|
|
</para>
|
|
<para>
|
|
This can be used to create timers that do not drift with respect to system time:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$hourly = EvPeriodic(0, 3600, NULL, function () {
|
|
echo "once per hour\n";
|
|
};
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
That doesn't mean there will always be <constant>3600</constant> seconds in
|
|
between triggers, but only that the the callback will be called when the
|
|
system time shows a full hour(<emphasis>UTC</emphasis>).
|
|
</para>
|
|
<para>
|
|
<classname>EvPeriodic</classname> will try to run the callback in this mode
|
|
at the next possible time where <varname>time</varname> =
|
|
<parameter>offset</parameter> (<literal>mod</literal>
|
|
<parameter>interval</parameter>), regardless of any time jumps.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para><emphasis>Manual reschedule mode</emphasis>.
|
|
In this mode <parameter>reschedule_cb</parameter> is a
|
|
<type>callable</type>.
|
|
</para>
|
|
<para>
|
|
<parameter>interval</parameter> and <parameter>offset</parameter> are both
|
|
being ignored. Instead, each time the periodic watcher gets scheduled, the
|
|
reschedule callback (<parameter>reschedule_cb</parameter>) will be called
|
|
with the watcher as first, and the current time as second argument.
|
|
</para>
|
|
<para>
|
|
This callback <emphasis>must not</emphasis> stop or destroy this or any other
|
|
periodic watchers, ever, and <emphasis>must not</emphasis> call any event loop
|
|
functions or methods. If you need to stop it, return <constant>1e30</constant>
|
|
and stop it afterwards. You may create and start a
|
|
<classname>EvPrepare</classname> watcher for this task.
|
|
</para>
|
|
<para>
|
|
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 to the second argument). It
|
|
will usually be called just before the callback will be triggered, but might
|
|
be called at other times, too.
|
|
</para>
|
|
|
|
<example>
|
|
<title>Using reschedule callback</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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();
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|
|
|