add
int \Workerman\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
Đặt lịch để thực thi một hàm hoặc phương thức của lớp.
Lưu ý: Bộ hẹn giờ chạy trong tiến trình hiện tại, workerman sẽ không tạo tiến trình hoặc luồng mới để chạy bộ hẹn giờ.
Tham số
time_interval
Thời gian thực hiện lại, đơn vị giây, hỗ trợ số thập phân, có thể chính xác đến 0.001, tức là chính xác đến mức mili giây.
callback
Hàm gọi lại Lưu ý: Nếu hàm gọi lại là phương thức của lớp, thì phương thức đó phải là thuộc tính public
args
Các tham số của hàm gọi lại, phải là mảng, các phần tử của mảng là giá trị tham số
persistent
Có phải là lâu dài hay không, nếu chỉ muốn thực hiện một lần, thì truyền giá trị false (các tác vụ chỉ thực hiện một lần sẽ tự động bị hủy sau khi thực hiện xong, không cần gọi Timer::del() ). Mặc định là true, tức là sẽ thực hiện định kỳ.
Giá trị trả về
Trả về một số nguyên, đại diện cho timerid của bộ hẹn giờ, có thể hủy bộ hẹn giờ này bằng cách gọi Timer::del($timerid).
Ví dụ
1、Hàm định kỳ là hàm ẩn danh (closure)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// Mở bao nhiêu tiến trình để chạy nhiệm vụ định kỳ, chú ý đến các vấn đề đồng thời trong nhiều tiến trình
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
// Thực hiện mỗi 2.5 giây
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "task run\n";
});
};
// Chạy worker
Worker::runAll();
2、Chỉ thiết lập bộ hẹn giờ trong tiến trình chỉ định
Một phiên bản worker có 4 tiến trình, chỉ thiết lập bộ hẹn giờ trên tiến trình có id là 0.
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
// Chỉ thiết lập bộ hẹn giờ trên tiến trình có id là 0, các tiến trình 1, 2, 3 không thiết lập bộ hẹn giờ
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 tiến trình worker, chỉ thiết lập bộ hẹn giờ trên tiến trình 0\n";
});
}
};
// Chạy worker
Worker::runAll();
3、Hàm định kỳ là hàm ẩn danh, truyền tham số bằng 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;
// Thiết lập bộ hẹn giờ cho kết nối tương ứng khi kết nối được thiết lập
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Thực hiện mỗi 10 giây
$time_interval = 10;
$connect_time = time();
// Tạm thời thêm thuộc tính timer_id vào đối tượng connection để lưu trữ id bộ hẹn giờ
$connection->timer_id = Timer::add($time_interval, function()use($connection, $connect_time)
{
$connection->send($connect_time);
});
};
// Khi kết nối đóng, xóa bộ hẹn giờ tương ứng
$ws_worker->onClose = function(TcpConnection $connection)
{
// Xóa bộ hẹn giờ
Timer::del($connection->timer_id);
};
// Chạy worker
Worker::runAll();
4、Hàm định kỳ là hàm ẩn danh, sử dụng giao diện bộ hẹn giờ để truyền tham số
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;
// Thiết lập bộ hẹn giờ cho kết nối tương ứng khi kết nối được thiết lập
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Thực hiện mỗi 10 giây
$time_interval = 10;
$connect_time = time();
// Tạm thời thêm thuộc tính timer_id vào đối tượng connection để lưu trữ id bộ hẹn giờ
$connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
{
$connection->send($connect_time);
}, array($connection, $connect_time));
};
// Khi kết nối đóng, xóa bộ hẹn giờ tương ứng
$ws_worker->onClose = function(TcpConnection $connection)
{
// Xóa bộ hẹn giờ
Timer::del($connection->timer_id);
};
// Chạy worker
Worker::runAll();
5、Hàm định kỳ là hàm thông thường
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
// Hàm thông thường
function send_mail($to, $content)
{
echo "gửi mail ...\n";
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$to = 'workerman@workerman.net';
$content = 'xin chào workerman';
// Thực hiện gửi mail sau 10 giây, tham số cuối cùng truyền giá trị false, nghĩa là chỉ chạy một lần
Timer::add(10, 'send_mail', array($to, $content), false);
};
// Chạy worker
Worker::runAll();
6、Hàm định kỳ là phương thức của lớp
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Lưu ý, thuộc tính hàm gọi lại phải là public
public function send($to, $content)
{
echo "gửi mail ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// Gửi một email sau 10 giây
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'xin chào workerman';
Timer::add(10, array($mail, 'send'), array($to, $content), false);
};
// Chạy worker
Worker::runAll();
7、Hàm định kỳ là phương thức của lớp (sử dụng bộ hẹn giờ bên trong lớp)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Lưu ý, thuộc tính hàm gọi lại phải là public
public function send($to, $content)
{
echo "gửi mail ...\n";
}
public function sendLater($to, $content)
{
// Phương thức gọi lại thuộc về lớp hiện tại, do đó, phần tử đầu tiên của mảng gọi lại là $this
Timer::add(10, array($this, 'send'), array($to, $content), false);
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Gửi một email sau 10 giây
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'xin chào workerman';
$mail->sendLater($to, $content);
};
// Chạy worker
Worker::runAll();
8、Hàm định kỳ là phương thức tĩnh của lớp
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Lưu ý đây là phương thức tĩnh, thuộc tính hàm gọi lại cũng phải là public
public static function send($to, $content)
{
echo "gửi mail ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Gửi một email sau 10 giây
$to = 'workerman@workerman.net';
$content = 'xin chào workerman';
// Gọi phương thức tĩnh của lớp định kỳ
Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};
// Chạy worker
Worker::runAll();
9、Hàm định kỳ là phương thức tĩnh của lớp (có namespace)
namespace Task;
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Lưu ý đây là phương thức tĩnh, thuộc tính hàm gọi lại cũng phải là public
public static function send($to, $content)
{
echo "gửi mail ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Gửi một email sau 10 giây
$to = 'workerman@workerman.net';
$content = 'xin chào workerman';
// Gọi phương thức tĩnh của lớp có namespace định kỳ
Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};
// Chạy worker
Worker::runAll();
10、Hủy bộ hẹn giờ hiện tại từ bên trong bộ hẹn giờ (sử dụng closure để truyền $timer_id)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Đếm
$count = 1;
// Để $timer_id có thể được truyền đúng vào bên trong hàm gọi lại, $timer_id phải có ký hiệu địa chỉ &
$timer_id = Timer::add(1, function()use(&$timer_id, &$count)
{
echo "Timer run $count\n";
// Sau 10 lần chạy, xóa bộ hẹn giờ hiện tại
if($count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
});
};
// Chạy worker
Worker::runAll();
11、Hủy bộ hẹn giờ hiện tại từ bên trong bộ hẹn giờ (truyền $timer_id theo cách tham số)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
public function send($to, $content, $timer_id)
{
// Tạm thời thêm thuộc tính count vào đối tượng hiện tại để ghi lại số lần chạy bộ hẹn giờ
$this->count = empty($this->count) ? 1 : $this->count;
// Sau 10 lần chạy, xóa bộ hẹn giờ hiện tại
echo "gửi 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();
// Để $timer_id có thể được truyền đúng vào bên trong hàm gọi lại, $timer_id phải có ký hiệu địa chỉ &
$timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};
// Chạy worker
Worker::runAll();