If your process uses SIGALRM and sleep() at the same time, the alarm set could make sleep() to return prematurely.
To avoid this and ensure your process waits a number of seconds you could use a function or class similar to this one:
<?php
class SleepWorkaroundForSIGALRM {
private $time;
function __construct($seconds) {
$this->time = time() + $seconds;
while ($this->time >= time()) {
sleep(1);
}
}
?>
pcntl_alarm
(PHP 4 >= 4.3.0, PHP 5)
pcntl_alarm — Setzt einen Zeitschalter für die Auslieferung eines Signals
Beschreibung
int pcntl_alarm
( int
$seconds
)
Die Funktion pcntl_alarm() erzeugt eine Zeitschaltuhr,
die ein SIGALRM Signal an den Prozess senden wird,
nachdem seconds Sekunden vergangen sind.
Wenn seconds Null ist wird kein neuer Timer
erzeugt. Jeder Aufruf von pcntl_alarm() wird jeden
zuvor erzeugten Zeitschalter abbrechen.
pcntl_alarm() wird die Zeitangabe in Sekunden zurückgeben, die ein zuvor angesetzter Zeitschalter übrig hatte, bevor er ausgeliefert werden sollte, oder 0, wenn es keinen vorher angesetzten Zeitschalter gab.
thessoro at gmail dot com
20-Apr-2011 09:05
j at ukr-info dot net
20-Oct-2005 04:51
<?php
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM\n";
pcntl_alarm(5);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5);
for(;;) {
}
?>
