php-doc-en/reference/ev/periodic-modes.xml
Ruslan Osmanov 27d57bc40b Add: ev extension docs
git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@328897 c90b9560-bf6c-de11-be94-00142212c4b1
2012-12-26 19:46:06 +00:00

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> &gt; <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
-->