Signatur
Beschreibung
register_tick_function() ermöglicht es, eine beliebige PHP-Funktion (oder Methode) so zu registrieren, dass sie bei jedem Tick aufgerufen wird. Ein Tick ist ein internes Ereignis, das nach je N ausführbaren Anweisungen ausgelöst wird, wobei N über declare(ticks=N) festgelegt wird.
Typische Anwendungsfälle sind einfaches Profiling, Überwachung von Skript-Laufzeiten, periodische Aufgaben innerhalb eines long-running Scripts (z. B. im CLI-Betrieb) sowie Debugging-Mechanismen. Es können mehrere Callback-Funktionen gleichzeitig registriert werden; sie werden in der Reihenfolge ihrer Registrierung aufgerufen.
Um eine registrierte Funktion wieder zu entfernen, steht unregister_tick_function() zur Verfügung. Wichtig: declare(ticks=N) muss im selben Geltungsbereich (Datei/Block) aktiv sein, in dem der zu beobachtende Code läuft, sonst werden keine Ticks ausgelöst.
- Performance: Ticks erzeugen messbaren Overhead; in Produktionscode sollte der Einsatz gut abgewogen werden.
- Methoden: Objektmethoden können als Array
[$object, 'methodName']übergeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Die Funktion oder Methode, die bei jedem Tick aufgerufen wird. Kann eine benannte Funktion, eine anonyme Funktion (Closure) oder ein Array in der Form [$object, 'method'] sein. |
|
| $args | mixed | Beliebig viele optionale Argumente, die bei jedem Aufruf des Callbacks übergeben werden. |
Rückgabewert
true zurück, wenn die Funktion erfolgreich registriert wurde, andernfalls false.Beispiele
Einfache Tick-Überwachung mit einer anonymen Funktion
<?php
declare(ticks=1);
$tickCount = 0;
register_tick_function(function () use (&$tickCount) {
$tickCount++;
});
$sum = 0;
for ($i = 1; $i <= 5; $i++) {
$sum += $i;
}
unregister_tick_function(function () use (&$tickCount) {});
echo "Summe: $sum" . PHP_EOL;
echo "Ticks gezählt: $tickCount" . PHP_EOL;
Tick-Funktion mit Objektmethode und Argumenten
<?php
declare(ticks=2);
class TickMonitor
{
private int $count = 0;
private string $label;
public function __construct(string $label)
{
$this->label = $label;
}
public function onTick(string $prefix): void
{
$this->count++;
// Im Produktivcode würde man hier z. B. in eine Datei loggen
}
public function getCount(): int
{
return $this->count;
}
}
$monitor = new TickMonitor('demo');
$registered = register_tick_function([$monitor, 'onTick'], 'tick');
if ($registered) {
echo "Tick-Funktion erfolgreich registriert." . PHP_EOL;
}
// Simulierter Arbeitsblock
for ($i = 0; $i < 10; $i++) {
$result = $i * $i;
}
unregister_tick_function([$monitor, 'onTick']);
echo "Tick-Aufrufe: " . $monitor->getCount() . PHP_EOL;
// Wichtig · Fallstricke
Performance-Warnung: Jeder Tick erzeugt einen Funktionsaufruf-Overhead. Bei kleinem N (z. B. ticks=1) und intensiven Schleifen kann dies die Ausführungszeit erheblich verlangsamen. Nur sparsam in Produktionsumgebungen einsetzen.
Geltungsbereich von declare(ticks): Die Direktive gilt nur für den Block oder die Datei, in der sie deklariert wird. Code in eingebundenen Dateien (require/include) ohne eigene declare-Anweisung erzeugt keine Ticks, auch wenn die Tick-Funktion registriert ist.
Closures und unregister_tick_function(): Das Entfernen einer anonymen Funktion mit unregister_tick_function() ist schwierig, da jede anonyme Funktion ein neues Objekt ist. Es empfiehlt sich, Closures in Variablen zu speichern, um sie später zuverlässig wieder zu entfernen.