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();