Heim  >  Artikel  >  PHP-Framework  >  Verwendung des Worker-Timers (mit Beispielcode)

Verwendung des Worker-Timers (mit Beispielcode)

尚
nach vorne
2019-11-25 14:20:063763Durchsuche

In der folgenden Spalte des Workerman-PHP-Tutorials wird die Verwendung des Workerman-Timers vorgestellt

Verwendung des Worker-Timers (mit Beispielcode)

Workerman ist ein leistungsstarkes Socket-Server-Kommunikationsframework, das zur schnellen Entwicklung verschiedener Netzwerkanwendungen verwendet wird, einschließlich TCP-, UDP-, Langverbindungs- und Kurzverbindungsanwendungen. Lassen Sie uns die Verwendung des Workerman-Timers vorstellen.

hinzufügen

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

Eine Funktion oder Klassenmethode regelmäßig ausführen

Parameter

time_interval: wie oft ausgeführt werden soll, in Sekunden, unterstützt Dezimalzahlen, ja Genau 0,001, also auf die Millisekunde genau.

Rückruf: Rückruffunktion Hinweis: Wenn die Rückruffunktion eine Methode der Klasse ist, muss die Methode ein öffentliches Attribut sein

Argumente: Die Parameter der Rückruffunktion müssen ein Array sein. und die Array-Elemente sind Parameterwerte

persistent: Ob es persistent ist. Wenn Sie es nur einmal regelmäßig ausführen möchten, übergeben Sie false (eine Aufgabe, die nur einmal ausgeführt wird, wird nach der Ausführung automatisch zerstört, und das ist der Fall Timer::del() muss nicht aufgerufen werden. Der Standardwert ist true, was bedeutet, dass er immer regelmäßig ausgeführt wird.

Rückgabewert

Gibt eine Ganzzahl zurück, die die Timer-ID des Timers darstellt. Dieser Timer kann durch Aufruf von Timer::del($timerid) zerstört werden.

Beispiel

1. Die Timing-Funktion ist eine anonyme Funktion (Abschluss)

use \Workerman\Worker;
use \Workerman\Lib\Timer;
require_once './Workerman/Autoloader.php';

$task = new Worker();
// 开启多少个进程运行定时任务,注意多进程并发问题
$task->count = 1;
$task->onWorkerStart = function($task)
{
    // 每2.5秒执行一次
    $time_interval = 2.5;
    Timer::add($time_interval, function()
    {
        echo "task run\n";
    });
};

// 运行worker
Worker::runAll();

2. Die Timing-Funktion ist eine gewöhnliche Funktion

require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

// 普通的函数
function send_mail($to, $content)
{
    echo "send mail ...\n";
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // 10秒后执行发送邮件任务,最后一个参数传递false,表示只运行一次
    Timer::add(10, 'send_mail', array($to, $content), false);
};

// 运行worker
Worker::runAll();

3. Die Timing-Funktion ist eine Klassenmethode

require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

class Mail
{
    // 注意,回调函数属性必须是public
    public function send($to, $content)
    {
        echo "send mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 10秒后发送一次邮件
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    Timer::add(10, array($mail, 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

Die Timing-Funktion ist eine Klassenmethode (Timer wird innerhalb der Klasse verwendet)

require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

class Mail
{
    // 注意,回调函数属性必须是public
    public function send($to, $content)
    {
        echo "send mail ...\n";
    }

    public function sendLater($to, $content)
    {
        // 回调的方法属于当前的类,则回调数组第一个元素为$this
        Timer::add(10, array($this, 'send'), array($to, $content), false);
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 10秒后发送一次邮件
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    $mail->sendLater($to, $content);
};

// 运行worker
Worker::runAll();

5. Die Timing-Funktion ist eine statische Methode der Klasse

require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

class Mail
{
    // 注意这个是静态方法,回调函数属性也必须是public
    public static function send($to, $content)
    {
        echo "send mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 10秒后发送一次邮件
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // 定时调用类的静态方法
    Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

6. Timing Die Funktion ist eine statische Methode der Klasse (mit Namespace)

namespace Task;
require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

class Mail
{
    // 注意这个是静态方法,回调函数属性也必须是public
    public static function send($to, $content)
    {
        echo "send mail ...\n";
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 10秒后发送一次邮件
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    // 定时调用带命名空间的类的静态方法
    Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

7. Zerstöre den aktuellen Timer im Timer (verwende die Abschlussmethode, um $timer_id zu übergeben)

use \Workerman\Worker;
use \Workerman\Lib\Timer;
require_once './Workerman/Autoloader.php';

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 计数
    $count = 1;
    // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
    $timer_id = Timer::add(1, function()use(&$timer_id, &$count)
    {
        echo "Timer run $count\n";
        // 运行10次后销毁当前定时器
        if($count++ >= 10)
        {
            echo "Timer::del($timer_id)\n";
            Timer::del($timer_id);
        }
    });
};

// 运行worker
Worker::runAll();

8. Zerstöre den aktuellen Timer im Timer Timer (übergebe $timer_id als Parameter)

require_once './Workerman/Autoloader.php';
use \Workerman\Worker;
use \Workerman\Lib\Timer;

class Mail
{
    public function send($to, $content, $timer_id)
    {
        // 临时给当前对象添加一个count属性,记录定时器运行次数
        $this->count = empty($this->count) ? 1 : $this->count;
        // 运行10次后销毁当前定时器
        echo "send mail {$this->count}...\n";
        if($this->count++ >= 10)
        {
            echo "Timer::del($timer_id)\n";
            Timer::del($timer_id);
        }
    }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
    $mail = new Mail();
    // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
    $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};

// 运行worker
Worker::runAll();

9. Setze den Timer nur im angegebenen Prozess

Eine Worker-Instanz hat 4 Prozesse , und stellen Sie es nur auf den Prozess mit der ID-Nummer 0 Timer ein.

use Workerman\Worker;
use Workerman\Lib\Timer;
require_once './Workerman/Autoloader.php';

$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function($worker)
{
    // 只在id编号为0的进程上设置定时器,其它1、2、3号进程不设置定时器
    if($worker->id === 0)
    {
        Timer::add(1, function(){
            echo "4个worker进程,只在0号进程设置定时器\n";
        });
    }
};
// 运行worker
Worker::runAll();

Für mehr Workerman-Wissen beachten Sie bitte die Spalte Workerman-Tutorial.

Das obige ist der detaillierte Inhalt vonVerwendung des Worker-Timers (mit Beispielcode). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen