Signatur
Beschreibung
Ticks sind ein Mechanismus in PHP, der es ermöglicht, nach einer bestimmten Anzahl von sogenannten tickable statements (zählbare Anweisungen) automatisch eine oder mehrere Funktionen auszuführen. Die Anzahl der Anweisungen zwischen zwei Ticks wird über die declare(ticks=N)-Direktive gesteuert. Mit register_tick_function() lassen sich Funktionen registrieren, die bei jedem Tick aufgerufen werden.
unregister_tick_function() entfernt eine solche Registrierung wieder. Das ist wichtig, um sicherzustellen, dass eine Tick-Funktion nur für einen bestimmten Code-Abschnitt aktiv ist und danach keine Ressourcen mehr verbraucht oder unerwünschte Seiteneffekte verursacht.
Typische Anwendungsfälle sind Profiling, Debugging, das Überwachen von Laufzeit-Metriken oder das periodische Prüfen von Abbruchbedingungen während langer Schleifen. Nach Abschluss der überwachten Routine sollte die Tick-Funktion stets wieder abgemeldet werden.
Der übergebene $callback-Parameter muss exakt mit dem beim Registrieren verwendeten Callable übereinstimmen. Bei Methoden-Arrays oder Closures ist besondere Sorgfalt geboten, da PHP die Identität des Callables prüft.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Das Callable, das zuvor mit register_tick_function() registriert wurde und nun abgemeldet werden soll. Es muss mit dem ursprünglichen Callable übereinstimmen (gleiche Funktion, gleiche Methode oder exakt dieselbe Closure-Instanz). |
Rückgabewert
Beispiele
Einfache Tick-Funktion registrieren und wieder abmelden
<?php
$tickCount = 0;
function myTickHandler(): void {
global $tickCount;
$tickCount++;
}
declare(ticks=1) {
register_tick_function('myTickHandler');
$a = 1 + 1; // Tick
$b = $a * 3; // Tick
$c = $b - 2; // Tick
unregister_tick_function('myTickHandler');
// Ab hier werden keine Ticks mehr durch myTickHandler gezählt
$d = $c + 10; // kein Tick mehr
}
echo "Tick-Aufrufe: $tickCount" . PHP_EOL;
Tick-Überwachung mit einer Klassen-Methode
<?php
class PerformanceMonitor {
public int $calls = 0;
public function onTick(): void {
$this->calls++;
}
}
$monitor = new PerformanceMonitor();
declare(ticks=2) {
register_tick_function([$monitor, 'onTick']);
for ($i = 0; $i < 6; $i++) {
// Jede zweite Anweisung löst einen Tick aus
$x = $i * $i;
}
unregister_tick_function([$monitor, 'onTick']);
// Weiterer Code ohne Tick-Überwachung
$y = 42;
}
echo "Monitor wurde {$monitor->calls}x aufgerufen." . PHP_EOL;
// Wichtig · Fallstricke
Closure-Identität: Wird eine anonyme Funktion (Closure) registriert, muss die exakt gleiche Instanz an unregister_tick_function() übergeben werden. Eine neue Closure mit identischem Inhalt gilt als anderes Objekt und kann nicht abgemeldet werden. Die Closure sollte daher in einer Variablen gespeichert werden.
Leistung: Tick-Funktionen erhöhen den Overhead erheblich, da sie nach jedem N-ten Statement aufgerufen werden. Tick-basiertes Profiling sollte daher nur in Entwicklungsumgebungen eingesetzt werden.
Gültigkeitsbereich: declare(ticks=N) gilt nur für den Block oder die Datei, in der es deklariert wurde. Tick-Funktionen bleiben jedoch global registriert, weshalb unregister_tick_function() immer aufgerufen werden sollte, wenn die Überwachung nicht mehr benötigt wird.