agregar
int \Workerman\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
Ejecutar una función o método de clase en intervalos de tiempo.
Nota: El temporizador se ejecuta en el proceso actual, Workerman no crea nuevos procesos o hilos para ejecutar el temporizador.
Parámetros
time_interval
La duración del intervalo, en segundos, admite decimales, puede ser preciso hasta 0.001, es decir, preciso a nivel de milésimas de segundo.
callback
Función de devolución de llamada Nota: Si la función de devolución de llamada es un método de clase, el método debe ser una propiedad pública
args
Parámetros de la función de devolución de llamada, debe ser un array, los elementos del array son los valores de los parámetros.
persistent
Indica si es persistente; si solo se desea ejecutar una vez, debe pasar false (las tareas que se ejecutan una sola vez se destruyen automáticamente después de completarse, no es necesario llamar a Timer::del()).
Por defecto es true, es decir, se ejecuta repetidamente.
Valor de retorno
Devuelve un entero que representa el timerid del temporizador, se puede destruir este temporizador llamando a Timer::del($timerid).
Ejemplos
1. Temporizador como función anónima (closure)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// Número de procesos en los que ejecutar la tarea programada, tenga en cuenta problemas de concurrencia en múltiples procesos
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
// Ejecutar cada 2.5 segundos
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "tarea ejecutada\n";
});
};
// Ejecutar el worker
Worker::runAll();
2. Establecer el temporizador solo en el proceso especificado
Un ejemplo de worker con 4 procesos, el temporizador se establece solo en el proceso con id 0.
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
// Establecer el temporizador solo en el proceso con id 0, los procesos 1, 2 y 3 no tienen temporizador
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 procesos de worker, temporizador establecido solo en el proceso 0\n";
});
}
};
// Ejecutar el worker
Worker::runAll();
3. Temporizador como función anónima, pasando parámetros mediante 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;
// Establecer un temporizador para la conexión correspondiente cuando se establece la conexión
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Ejecutar cada 10 segundos
$time_interval = 10;
$connect_time = time();
// Agregar temporalmente una propiedad timer_id al objeto connection para guardar el id del temporizador
$connection->timer_id = Timer::add($time_interval, function()use($connection, $connect_time)
{
$connection->send($connect_time);
});
};
// Al cerrar la conexión, eliminar el temporizador correspondiente
$ws_worker->onClose = function(TcpConnection $connection)
{
// Eliminar el temporizador
Timer::del($connection->timer_id);
};
// Ejecutar el worker
Worker::runAll();
4. Temporizador como función anónima, pasando parámetros mediante la interfaz del temporizador
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;
// Establecer un temporizador para la conexión correspondiente cuando se establece la conexión
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Ejecutar cada 10 segundos
$time_interval = 10;
$connect_time = time();
// Agregar temporalmente una propiedad timer_id al objeto connection para guardar el id del temporizador
$connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
{
$connection->send($connect_time);
}, array($connection, $connect_time));
};
// Al cerrar la conexión, eliminar el temporizador correspondiente
$ws_worker->onClose = function(TcpConnection $connection)
{
// Eliminar el temporizador
Timer::del($connection->timer_id);
};
// Ejecutar el worker
Worker::runAll();
5. Temporizador como función normal
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
// Función normal
function send_mail($to, $content)
{
echo "enviando correo ...\n";
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$to = 'workerman@workerman.net';
$content = 'hola workerman';
// Ejecutar la tarea de envío de correo después de 10 segundos, el último parámetro pasa false, indicando que se ejecuta una sola vez
Timer::add(10, 'send_mail', array($to, $content), false);
};
// Ejecutar el worker
Worker::runAll();
6. Temporizador como método de clase
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Nota: la propiedad de la función de devolución de llamada debe ser pública
public function send($to, $content)
{
echo "enviando correo ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// Enviar un correo después de 10 segundos
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'hola workerman';
Timer::add(10, array($mail, 'send'), array($to, $content), false);
};
// Ejecutar el worker
Worker::runAll();
7. Temporizador como método de clase (uso de temporizador dentro de la clase)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Nota: la propiedad de la función de devolución de llamada debe ser pública
public function send($to, $content)
{
echo "enviando correo ...\n";
}
public function sendLater($to, $content)
{
// Si el método de devolución de llamada pertenece a la clase actual, entonces el primer elemento del array de devolución de llamada es $this
Timer::add(10, array($this, 'send'), array($to, $content), false);
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Enviar un correo después de 10 segundos
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'hola workerman';
$mail->sendLater($to, $content);
};
// Ejecutar el worker
Worker::runAll();
8. Temporizador como método estático de clase
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Nota: este es un método estático, la propiedad de la función de devolución de llamada también debe ser pública
public static function send($to, $content)
{
echo "enviando correo ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Enviar un correo después de 10 segundos
$to = 'workerman@workerman.net';
$content = 'hola workerman';
// Llamada programada al método estático de la clase
Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};
// Ejecutar el worker
Worker::runAll();
9. Temporizador como método estático de clase (con namespace)
namespace Task;
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Nota: este es un método estático, la propiedad de la función de devolución de llamada también debe ser pública
public static function send($to, $content)
{
echo "enviando correo ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Enviar un correo después de 10 segundos
$to = 'workerman@workerman.net';
$content = 'hola workerman';
// Llamada programada al método estático de la clase con namespace
Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};
// Ejecutar el worker
Worker::runAll();
10. Destruir el temporizador actual dentro del temporizador (pasar $timer_id usando closure)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Contador
$count = 1;
// Para que $timer_id se pase correctamente a la función de devolución de llamada, debe precederse con el símbolo de dirección &
$timer_id = Timer::add(1, function()use(&$timer_id, &$count)
{
echo "Temporizador ejecutado $count\n";
// Después de 10 ejecuciones, destruir el temporizador actual
if($count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
});
};
// Ejecutar el worker
Worker::runAll();
11. Destruir el temporizador actual dentro del temporizador (pasar $timer_id como parámetro)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
public function send($to, $content, $timer_id)
{
// Agregar temporalmente una propiedad count al objeto actual para registrar el número de ejecuciones del temporizador
$this->count = empty($this->count) ? 1 : $this->count;
// Después de 10 ejecuciones, destruir el temporizador actual
echo "enviando correo {$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();
// Para que $timer_id se pase correctamente a la función de devolución de llamada, debe precederse con el símbolo de dirección &
$timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};
// Ejecutar el worker
Worker::runAll();