Start · Sprachen · PHP · Referenz · register_tick_function

register_tick_function

Funktion

Registriert eine Callback-Funktion, die bei jedem <code>declare(ticks=N)</code>-Tick automatisch ausgeführt wird.

seit PHP 4.0.3 Kategorie: oop

Signatur

register_tick_function(callable $callback, mixed ...$args): bool

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

Typ
bool
Beschreibung
Gibt 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;
Summe: 15 Ticks gezählt: (variiert je nach PHP-Version und Compiler)

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;
Tick-Funktion erfolgreich registriert. Tick-Aufrufe: (variiert je nach PHP-Version)

// 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.