add

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

Exécute périodiquement une fonction ou une méthode de classe.

Remarque : Le minuteur s'exécute dans le processus actuel, Workerman ne créera pas de nouveaux processus ou threads pour exécuter le minuteur.

Paramètres

time_interval

Fréquence d'exécution, en secondes, supporte les décimales, peut aller jusqu'à 0.001, c’est-à-dire de manière précise à la milliseconde.

callback

Fonction de rappel Remarque : Si la fonction de rappel est une méthode de classe, la méthode doit être publique

args

Les paramètres de la fonction de rappel, doivent être un tableau, les éléments du tableau sont des valeurs de paramètres.

persistent

S'il s'agit d'un minuteur persistant, si vous souhaitez l'exécuter une seule fois, passez faux (les tâches ne s'exécutant qu'une fois seront automatiquement détruites après leur exécution, il n'est pas nécessaire d'appeler Timer::del()). Par défaut, c’est vrai, ce qui signifie que l'exécution est continue.

Valeur de retour

Retourne un entier, représentant l'identifiant du minuteur, qui peut être détruit en appelant Timer::del($timerid).

Exemple

1. Fonction minuteur comme fonction anonyme (closure)

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

$task = new Worker();
// Nombre de processus à exécuter la tâche planifiée, attention aux problèmes de concurrence en mode multi-processus
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
    // Exécuté toutes les 2,5 secondes
    $time_interval = 2.5;
    Timer::add($time_interval, function()
    {
        echo "tâche exécutée\n";
    });
};

// Exécuter le worker
Worker::runAll();

2. Définir le minuteur uniquement dans le processus spécifié

Une instance de worker dispose de 4 processus, définissant le minuteur uniquement dans le processus dont l'identifiant est 0.

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

$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
    // Définir le minuteur uniquement dans le processus dont l'identifiant est 0, les processus 1, 2, 3 ne définissent pas de minuteur.
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "Les 4 processus worker, minuteur défini uniquement dans le processus 0\n";
        });
    }
};
// Exécuter le worker
Worker::runAll();

3. Fonction minuteur comme fonction anonyme, passant des paramètres via closure

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;
// Définir le minuteur lors de la connexion
$ws_worker->onConnect = function(TcpConnection $connection)
{
    // Exécuté toutes les 10 secondes
    $time_interval = 10;
    $connect_time = time();
    // Ajouter temporairement une propriété timer_id à l'objet connection pour enregistrer l'identifiant du minuteur
    $connection->timer_id = Timer::add($time_interval, function()use($connection, $connect_time)
    {
         $connection->send($connect_time);
    });
};
// Lors de la fermeture de la connexion, supprimer le minuteur correspondant
$ws_worker->onClose = function(TcpConnection $connection)
{
    // Supprimer le minuteur
    Timer::del($connection->timer_id);
};

// Exécuter le worker
Worker::runAll();

4. Fonction minuteur comme fonction anonyme, passant des paramètres via l'interface des minuteurs

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;
// Définir le minuteur lors de la connexion
$ws_worker->onConnect = function(TcpConnection $connection)
{
    // Exécuté toutes les 10 secondes
    $time_interval = 10;
    $connect_time = time();
    // Ajouter temporairement une propriété timer_id à l'objet connection pour enregistrer l'identifiant du minuteur
    $connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
    {
         $connection->send($connect_time);
    }, array($connection, $connect_time));
};
// Lors de la fermeture de la connexion, supprimer le minuteur correspondant
$ws_worker->onClose = function(TcpConnection $connection)
{
    // Supprimer le minuteur
    Timer::del($connection->timer_id);
};

// Exécuter le worker
Worker::runAll();

5. Fonction minuteur comme fonction normale

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

// Fonction normale
function send_mail($to, $content)
{
    echo "envoi du mail ...\n";
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // Exécutez la tâche d'envoi de mail après 10 secondes, dernier paramètre passé à faux, ce qui signifie exécuter une fois
    Timer::add(10, 'send_mail', array($to, $content), false);
};

// Exécuter le worker
Worker::runAll();

6. Fonction minuteur comme méthode de classe

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

class Mail
{
    // Remarque : la fonction de rappel doit être publique
    public function send($to, $content)
    {
        echo "envoi du mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // Envoie de l'email après 10 secondes
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    Timer::add(10, array($mail, 'send'), array($to, $content), false);
};

// Exécuter le worker
Worker::runAll();

7. Fonction minuteur comme méthode de classe (utilisation du minuteur à l'intérieur de la classe)

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

class Mail
{
    // Remarque : la fonction de rappel doit être publique
    public function send($to, $content)
    {
        echo "envoi du mail ...\n";
    }

    public function sendLater($to, $content)
    {
        // Si la méthode de rappel appartient à la classe actuelle, le premier élément du tableau de rappel sera $this
        Timer::add(10, array($this, 'send'), array($to, $content), false);
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Envoie de l'email après 10 secondes
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    $mail->sendLater($to, $content);
};

// Exécuter le worker
Worker::runAll();

8. Fonction minuteur comme méthode statique de classe

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

class Mail
{
    // Remarque : c'est une méthode statique, la fonction de rappel doit être publique
    public static function send($to, $content)
    {
        echo "envoi du mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Envoie de l'email après 10 secondes
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // Appel fréquent de la méthode statique de la classe
    Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};

// Exécuter le worker
Worker::runAll();

9. Fonction minuteur comme méthode statique de classe (avec espace de nom)

namespace Task;

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

class Mail
{
    // Remarque : c'est une méthode statique, la fonction de rappel doit être publique
    public static function send($to, $content)
    {
        echo "envoi du mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Envoie de l'email après 10 secondes
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // Appel fréquent de la méthode statique de la classe avec espace de nom
    Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};

// Exécuter le worker
Worker::runAll();

10. Détruire le minuteur actuel dans le minuteur (passer $timer_id par fermeture avec use)

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

$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
    // Compteur
    $count = 1;
    // Pour que $timer_id soit correctement passé à l'intérieur de la fonction de rappel, ajoutez le symbole d'adresse &
    $timer_id = Timer::add(1, function()use(&$timer_id, &$count)
    {
        echo "Minuteur exécuté $count\n";
        // Après 10 exécutions, détruire le minuteur actuel
        if($count++ >= 10)
        {
            echo "Timer::del($timer_id)\n";
            Timer::del($timer_id);
        }
    });
};

// Exécuter le worker
Worker::runAll();

11. Détruire le minuteur actuel dans le minuteur (passer $timer_id par les paramètres)

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

class Mail
{
    public function send($to, $content, $timer_id)
    {
        // Ajouter temporairement une propriété count à l'objet actuel pour enregistrer le nombre d'exécutions du minuteur
        $this->count = empty($this->count) ? 1 : $this->count;
        // Après 10 exécutions, détruire le minuteur actuel
        echo "envoi du mail {$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();
    // Pour que $timer_id soit correctement passé à l'intérieur de la fonction de rappel, ajoutez le symbole d'adresse &
    $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};

// Exécuter le worker
Worker::runAll();