mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-15 08:28:54 +00:00

Provided by an anonymous user. git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@349340 c90b9560-bf6c-de11-be94-00142212c4b1
162 lines
4.4 KiB
XML
162 lines
4.4 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<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 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. To stop it return
|
|
<constant>1e30</constant>
|
|
and stop it afterwards. An
|
|
<classname>EvPrepare</classname>
|
|
watcher may be used 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 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
|
|
-->
|