add

int \Workerman\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])

Führt eine bestimmte Funktion oder Klassenmethode zeitgerecht aus.

Hinweis: Der Timer läuft im aktuellen Prozess, es werden keine neuen Prozesse oder Threads zur Ausführung des Timers in Workerman erstellt.

Parameter

time_interval

Wie oft ausgeführt wird, in Sekunden, unterstützt Dezimalzahlen, kann auf 0.001 genau sein, d.h. auf Millisekunden genau.

callback

Rückruffunktion Hinweis: Wenn die Rückruffunktion eine Klassenmethode ist, muss die Methode eine public-Eigenschaft sein

args

Parameter der Rückruffunktion, muss ein Array sein, die Array-Elemente sind die Parameterwerte

persistent

Ob es sich um einen persistenten Timer handelt. Wenn Sie nur einmal ausführen möchten, übergeben Sie false (aufgaben, die nur einmal ausgeführt werden, werden nach der Ausführung automatisch zerstört, es muss kein Timer::del() aufgerufen werden). Standardmäßig ist es true, was bedeutet, dass es immer wieder zeitgerecht ausgeführt wird.

Rückgabewert

Gibt eine Ganzzahl zurück, die den Timer-ID repräsentiert, mit der Sie diesen Timer durch Aufruf von Timer::del($timerid) löschen können.

Beispiele

1. Zeitfunktion als anonymes Funktion (Closure)

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

$task = new Worker();
// Wie viele Prozesse zur Ausführung der zeitlichen Aufgaben gestartet werden, beachten Sie, ob die Geschäftslogik bei Multiprozesskonkurrenzprobleme hat
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
    // Alle 2,5 Sekunden ausführen
    $time_interval = 2.5;
    Timer::add($time_interval, function()
    {
        echo "Aufgabe läuft\n";
    });
};

// Worker ausführen
Worker::runAll();

2. Nur im angegebenen Prozess den Timer setzen

Ein Worker-Instanz hat 4 Prozesse, den Timer nur im Prozess mit der ID-Nummer 0 setzen.

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
    // Timer nur im Prozess mit der ID-Nummer 0 setzen, im Prozess 1, 2, 3 wird kein Timer gesetzt
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4 Worker-Prozesse, Timer nur im Prozess 0 gesetzt\n";
        });
    }
};
// Worker ausführen
Worker::runAll();

3. Zeitfunktion als anonymes Funktion, Parameter über Closure übergeben

use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// Timer setzen, wenn die Verbindung hergestellt ist
$ws_worker->onConnect = function(TcpConnection $connection)
{
    // Alle 10 Sekunden ausführen
    $time_interval = 10;
    $connect_time = time();
    // Temporär eine timer_id Eigenschaft zum Connection-Objekt hinzufügen, um die Timer-ID zu speichern
    $connection->timer_id = Timer::add($time_interval, function()use($connection, $connect_time)
    {
         $connection->send($connect_time);
    });
};
// Beim Schließen der Verbindung den entsprechenden Timer der Verbindung löschen
$ws_worker->onClose = function(TcpConnection $connection)
{
    // Timer löschen
    Timer::del($connection->timer_id);
};

// Worker ausführen
Worker::runAll();

4. Zeitfunktion als anonymes Funktion, Parameter über Timer-Schnittstelle übergeben

use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// Timer setzen, wenn die Verbindung hergestellt ist
$ws_worker->onConnect = function(TcpConnection $connection)
{
    // Alle 10 Sekunden ausführen
    $time_interval = 10;
    $connect_time = time();
    // Temporär eine timer_id Eigenschaft zum Connection-Objekt hinzufügen, um die Timer-ID zu speichern
    $connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
    {
         $connection->send($connect_time);
    }, array($connection, $connect_time));
};
// Beim Schließen der Verbindung den entsprechenden Timer der Verbindung löschen
$ws_worker->onClose = function(TcpConnection $connection)
{
    // Timer löschen
    Timer::del($connection->timer_id);
};

// Worker ausführen
Worker::runAll();

5. Zeitfunktion als normale Funktion

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

// Normale Funktion
function send_mail($to, $content)
{
    echo "E-Mail senden ...\n";
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    $to = 'workerman@workerman.net';
    $content = 'Hallo Workerman';
    // Nach 10 Sekunden die E-Mail senden, der letzte Parameter false bedeutet, nur einmal ausführen
    Timer::add(10, 'send_mail', array($to, $content), false);
};

// Worker ausführen
Worker::runAll();

6. Zeitfunktion als Klassenmethode

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

class Mail
{
    // Hinweis: Die Rückruffunktion muss public sein
    public function send($to, $content)
    {
        echo "E-Mail senden ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // Nach 10 Sekunden eine E-Mail senden
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'Hallo Workerman';
    Timer::add(10, array($mail, 'send'), array($to, $content), false);
};

// Worker ausführen
Worker::runAll();

7. Zeitfunktion als Klassenmethode (Timer innerhalb der Klasse verwenden)

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

class Mail
{
    // Hinweis: Die Rückruffunktion muss public sein
    public function send($to, $content)
    {
        echo "E-Mail senden ...\n";
    }

    public function sendLater($to, $content)
    {
        // Da die Methode zur aktuellen Klasse gehört, ist das erste Element des Rückruf-Arrays $this
        Timer::add(10, array($this, 'send'), array($to, $content), false);
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Nach 10 Sekunden eine E-Mail senden
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'Hallo Workerman';
    $mail->sendLater($to, $content);
};

// Worker ausführen
Worker::runAll();

8. Zeitfunktion als statische Klassenmethode

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

class Mail
{
    // Hinweis: Dies ist eine statische Methode, die Rückruffunktion muss auch public sein
    public static function send($to, $content)
    {
        echo "E-Mail senden ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Nach 10 Sekunden eine E-Mail senden
    $to = 'workerman@workerman.net';
    $content = 'Hallo Workerman';
    // Statische Methode der Klasse zeitgerecht aufrufen
    Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};

// Worker ausführen
Worker::runAll();

9. Zeitfunktion als statische Klassenmethode (mit Namensraum)

namespace Task;

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

class Mail
{
    // Hinweis: Dies ist eine statische Methode, die Rückruffunktion muss auch public sein
    public static function send($to, $content)
    {
        echo "E-Mail senden ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Nach 10 Sekunden eine E-Mail senden
    $to = 'workerman@workerman.net';
    $content = 'Hallo Workerman';
    // Statische Methode mit Namensraum zeitgerecht aufrufen
    Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};

// Worker ausführen
Worker::runAll();

10. Zerstörung des aktuellen Timers innerhalb des Timers (mit use Closure übergeben $timer_id)

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Zähler
    $count = 1;
    // Damit $timer_id korrekt in die Rückruffunktion übergeben wird, muss $timer_id mit & übergeben werden
    $timer_id = Timer::add(1, function()use(&$timer_id, &$count)
    {
        echo "Timer läuft $count\n";
        // Nach 10 Ausführungen den aktuellen Timer zerstören
        if($count++ >= 10)
        {
            echo "Timer::del($timer_id)\n";
            Timer::del($timer_id);
        }
    });
};

// Worker ausführen
Worker::runAll();

11. Zerstörung des aktuellen Timers innerhalb des Timers (mit Parameterübergabe $timer_id)

use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

class Mail
{
    public function send($to, $content, $timer_id)
    {
        // Temporär eine count-Eigenschaft zum aktuellen Objekt hinzufügen, um die Anzahl der Timer-Ausführungen zu zählen
        $this->count = empty($this->count) ? 1 : $this->count;
        // Nach 10 Ausführungen den aktuellen Timer zerstören
        echo "E-Mail senden {$this->count}...\n";
        if($this->count++ >= 10)
        {
            echo "Timer::del($timer_id)\n";
            Timer::del($timer_id);
        }
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    $mail = new Mail();
    // Damit $timer_id korrekt in die Rückruffunktion übergeben wird, muss $timer_id mit & übergeben werden
    $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};

// Worker ausführen
Worker::runAll();