2、添加的定時任務在當前進程執(zhí)行(不會啟動新的進程或者線程),如果任務很重(特別是涉及到網絡IO的任務),可能會導致該進程阻塞,暫時無法處理其它業(yè)務。所以最好將耗時的任務放到單獨的進程運行,例如建立一個/多個Worker進程運行
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4個worker進程,只在0號進程設置定時器\n";
});
}
這個只對進程id為0有效,比如我有10個定時器,開啟10個進程,怎么讓每個進程運行一個定時器?
<?php
namespace app\push\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
require_once APP_PATH . '/push/controller/Cron.php';
class Worker extends Server
{
protected $socket = 'text://0.0.0.0:2346';
//protected $count = 1;
protected $processes=10;
public function onWorkerStart($work){
//讀出符合條件的任務
$task = new Task();
$taskList = $task->getTaskList();
if ($taskList){
foreach ($taskList as $value){
$this->task($value);
}
}
}
//執(zhí)行的任務
public static function task($data){
//添加定時器,返回定時器的ID
$cron = new Cron();
$timer_id = Timer::add(1,array($cron,'execute'),array($data),true);
//更新任務定時器ID
$task = new Task();
$task->updateTimer($data,$timer_id);
return $timer_id;
}
/**
* 監(jiān)聽接收數據
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
$data = trim($data);
$data = json_decode($data,true);
//任務ID
$taskId = $data;
//請求類型
$type = $data;
switch ($type){
case 'add':
//添加定時器
$task = new Task();
$list = $task->getTaskById($taskId);
$timer_id = $this->task($list);
//發(fā)送數據
$data = array('code'=>1,'msg'=>'添加定時器成功');
break;
case 'stop':
//刪除定時器
$timer_id = $data;//定時器ID
//刪除定時器
$res = Timer::del($timer_id);
if ($res){
//刪除任務
$task = new Task();
$task->delTask($taskId);
$data = array('code'=>1, 'msg'=>'刪除定時器成功');
}else {
$data = array('code'=>0, 'msg'=>'刪除定時器失敗');
}
break;
default:
$data = array('code'=>505, 'msg'=>'非法請求');
break;
}
//$data = array('code'=>1, 'msg'=>'刪除定時器成功');
return $connection->close(json_encode($data));
}
public static function onWorkerStop(){
//清空定時任務
$task = new Task();
$task->clearTimer();
}
public static function onError($connection, $code, $msg){
return $msg;
}
}
[attach]1275[/attach]
file:///C:\Users\zhang\AppData\Roaming\Tencent\Users\171051823\QQ\WinTemp\RichOle\3(%L9K6)8Z$H_ZUKW7WJ[7D.png
file:///C:\Users\zhang\AppData\Roaming\Tencent\Users\171051823\QQ\WinTemp\RichOle\3(%L9K6)8Z$H_ZUKW7WJ[7D.png
當瀏覽器調用onMessage時,并不會在新的進程運行,怎么樣能在新的進程運行?
?