如何在workerman的Demo的基礎上,實現(xiàn) 每間隔一段時間,服務器向指定的用戶推送消息數(shù)據(jù)。
如何把定時代碼和workerman的代碼結(jié)合起來?
首先 講解下如何在其它項目中通過workerman向客戶端轉(zhuǎn)發(fā)數(shù)據(jù)(只針對Gateway/Worker模型開發(fā)的應用 如applications/Demo、workerman-chat、workerman-todpole等)
以applications/Demo為例
在其它項目中(比如apache運行的web項目),只要將applications/Demo這個文件夾拷貝到你的項目下,然后include Demo/Lib/Gateway.php ,然后直接使用\Lib\Gateway::sendToClient \Lib\Gateway::sendToAll 發(fā)送向客戶端數(shù)據(jù)了
如何定時
定時最簡單的方法是通過 linux的cron來做,也就是定時運行一下php的腳本。缺點是corn腳本最小時間間隔為1分鐘,如果時間間隔符合你的需求則可以使用cron,具體操作可以百度下
如果你需要秒級別的定時,則可以使用php腳本來做。php腳本里面一個while死循環(huán),里面配合sleep/usleep。然后運行nohup php youcron.php & 就一直后端運行了。缺點是如果腳本寫的不健壯,出現(xiàn)FatalError這個腳本就被終止了
也可以使用workerman來做定時,workerman中有一個設定定時任務的接口 \Man\Core\Lib\Task 可以在workerman中直接調(diào)用。
首先新建一個進程文件,假如有兩個定時任務,一個是每2秒向所有客戶端發(fā)送一段數(shù)據(jù),另外一個是每隔10秒向所有客戶端發(fā)送一段數(shù)據(jù)
新建一個文件 applications/Demo/Task.php
<?php
/*
* 一個定時任務,向通過workerman定時向客戶端發(fā)送數(shù)據(jù)
*/
// 向客戶端發(fā)送數(shù)據(jù)必須載入這個類
require_once __DIR__ . '/Lib/Gateway.php';
class Task extends Man\Core\SocketWorker
{
// 子進程啟動時會運行onStart, 整個進程生命周期只運行一次,這里用來注冊定時任務
public function onStart()
{
// 初始化定時任務,讓$this->event負責定時觸發(fā)
\Man\Core\Lib\Task::init($this->event);
// 定時任務1的時間間隔2秒
$time_interval1 = 2;
// 設定定時任務
\Man\Core\Lib\Task::add($time_interval1, function(){
// 任務邏輯,這里只發(fā)了一個字符串
\Lib\Gateway::sendToAll("I'm Task 1\n");
});
// 定時任務2的時間間隔10秒
$time_interval2 = 10;
// 設定定時任務,定時運行 $this->dealProcess();
\Man\Core\Lib\Task::add($time_interval2, array($this, 'taskTwo'));
}
// 另外一個要定時運行的類成員函數(shù)
public function taskTwo()
{
\Lib\Gateway::sendToAll("I'm Task 2\n");
}
// 這里不接收請求,函數(shù)留空
public function dealInput($recv_buffer){}
// 這里不接收請求,函數(shù)留空
public function dealProcess($recv_buffer){}
}
然后新建一個配置進程文件
applications/Demo/conf.d/Task.conf
;定時任務進程入口文件
worker_file = ../Task.php
;啟動多少進程,定時任務一般是一個進程,也可以開多個但是要注意多進程會不會給你帶來并發(fā)問題
start_workers=1
;以哪個用戶運行這個worker進程,要設置成權限較低的用戶,如 www-data nobody
user=root
最后啟動workerman并測試
運行 ./workerman/bin/workermand restart
然后運行telnet 127.0.0.1 8480
就可以看到定時任務的效果了,類似如下
telnet 127.0.0.1 8480
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
type in your name:
ff
chat room login success, your client_id is 7, name is ff
use client_id:words send message to one user
use words send message to all
ff come
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 2
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 2