2、添加的定時(shí)任務(wù)在當(dāng)前進(jìn)程執(zhí)行(不會(huì)啟動(dòng)新的進(jìn)程或者線程),如果任務(wù)很重(特別是涉及到網(wǎng)絡(luò)IO的任務(wù)),可能會(huì)導(dǎo)致該進(jìn)程阻塞,暫時(shí)無法處理其它業(yè)務(wù)。所以最好將耗時(shí)的任務(wù)放到單獨(dú)的進(jìn)程運(yùn)行,例如建立一個(gè)/多個(gè)Worker進(jìn)程運(yùn)行
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4個(gè)worker進(jìn)程,只在0號(hào)進(jìn)程設(shè)置定時(shí)器\n";
});
}
這個(gè)只對(duì)進(jìn)程id為0有效,比如我有10個(gè)定時(shí)器,開啟10個(gè)進(jìn)程,怎么讓每個(gè)進(jìn)程運(yùn)行一個(gè)定時(shí)器?
當(dāng)前開了10個(gè)進(jìn)程,已經(jīng)運(yùn)行5個(gè)定時(shí)器,在進(jìn)程0-4運(yùn)行,我從前端onMessage添加的定時(shí)器任務(wù),怎么在進(jìn)程5運(yùn)行?
<?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){
//讀出符合條件的任務(wù)
$task = new Task();
$taskList = $task->getTaskList();
if ($taskList){
foreach ($taskList as $value){
$this->task($value);
}
}
}
//執(zhí)行的任務(wù)
public static function task($data){
//添加定時(shí)器,返回定時(shí)器的ID
$cron = new Cron();
$timer_id = Timer::add(1,array($cron,'execute'),array($data),true);
//更新任務(wù)定時(shí)器ID
$task = new Task();
$task->updateTimer($data,$timer_id);
return $timer_id;
}
/**
* 監(jiān)聽接收數(shù)據(jù)
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
$data = trim($data);
$data = json_decode($data,true);
//任務(wù)ID
$taskId = $data;
//請(qǐng)求類型
$type = $data;
switch ($type){
case 'add':
//添加定時(shí)器
$task = new Task();
$list = $task->getTaskById($taskId);
$timer_id = $this->task($list);
//發(fā)送數(shù)據(jù)
$data = array('code'=>1,'msg'=>'添加定時(shí)器成功');
break;
case 'stop':
//刪除定時(shí)器
$timer_id = $data;//定時(shí)器ID
//刪除定時(shí)器
$res = Timer::del($timer_id);
if ($res){
//刪除任務(wù)
$task = new Task();
$task->delTask($taskId);
$data = array('code'=>1, 'msg'=>'刪除定時(shí)器成功');
}else {
$data = array('code'=>0, 'msg'=>'刪除定時(shí)器失敗');
}
break;
default:
$data = array('code'=>505, 'msg'=>'非法請(qǐng)求');
break;
}
//$data = array('code'=>1, 'msg'=>'刪除定時(shí)器成功');
return $connection->close(json_encode($data));
}
public static function onWorkerStop(){
//清空定時(shí)任務(wù)
$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
當(dāng)瀏覽器調(diào)用onMessage時(shí),并不會(huì)在新的進(jìn)程運(yùn)行,怎么樣能在新的進(jìn)程運(yùn)行?
?