PHPIndex

This page lists files in the current directory. You can view content, get download/execute commands for Wget, Curl, or PowerShell, or filter the list using wildcards (e.g., `*.sh`).

index.class.php
wget 'https://sme10.lists2.roe3.org/kodbox/plugins/msgWarning/controller/task/index.class.php'
View Content
<?php 
class msgWarningTaskIndex extends Controller {
	public function __construct() {
		parent::__construct();
		$this->pluginName = 'msgWarningPlugin';
    }
	public function getConfig() {
		return Action($this->pluginName)->getConfig();
	}

	// 更新同步计划任务
	public function updateTask($status){
		// 任务不存在:状态为0,返回;否则新增
		if(!$task = $this->getTask()) {
			return $this->addTask($status);
		}
		// 任务已存在:更新
		$data = array(
			'name'	 => $task['name'],
			'enable' => $status
		);
		Model('SystemTask')->update($task['id'], $data);
	}
	private function addTask($status){
		$data = array (
			'name'	=> LNG('msgWarning.main.taskTitle'),
			'type'	=> 'method',
			'event' => $this->pluginName.'.warning',
			'time'	=> '{"type":"minute","month":"1","week":"1","day":"08:00","minute":"1"}',
			'desc'	=> LNG('msgWarning.main.taskDesc'),
			'enable' => $status,
			'system' => 1,
		);
		return Model('SystemTask')->add($data);
	}
	// 获取计划任务,通过id查找有问题(卸载时可能没有删除,导致无法查找也无法新增)
	public function getTask(){
		$event = $this->pluginName.'.warning';
		return Model('SystemTask')->findByKey('event', $event);
	}
	// 删除计划任务
	public function delTask(){
		if(!$task = $this->getTask()) return;
		Model('SystemTask')->remove($task['id'], true);
	}


	/**
	 * 获取异常信息并发送
	 * @return void
	 */
	public function warning() {
		$config = $this->getConfig();
		// 1.是否开启了消息预警
		if ($config['enable'] != '1') return;
		if (!$this->canMsgSendNow($config)) return;

		// 2.获取发送目标
		$target = array_filter(explode(',', $config['target']));
		if (empty($target)) return;

		// 3.获取cpu、内存等使用信息,并写入记录
		// 读取mem、cpu的值;存入日志;删除指定时长之前的日志;取剩余日志量,比如时长为20分钟,理论上会存20条日志,只要达到80%——16条,就发送提醒;占用很高时(99%)直接发送(废弃)
		$server	  = new ServerInfo();
		$warnType = explode(',', $config['warnType']);

		$data = array();
		// 3.1 内存
		$type = 'mem';
		if (in_array($type, $warnType)) {
			$memUsage = $server->memUsage();	// [total=>1024,used=>24]
			$memValue = $memUsage['total'] > 0 ? round($memUsage['used']/$memUsage['total'], 3) : 0;
			if($memValue && $memValue > floatval($config['useRatio'] / 100)) {
				$rest = $this->warnUsage($type, array('value' => $memValue, 'data' => $memUsage));
				if (!$rest) $data[$type] = $memValue;
			}
		}
		// 3.2 cpu
		$type = 'cpu';
		if (in_array($type, $warnType)) {
			$cpuUsage = $server->cpuUsage();	// 0.23
			if($cpuUsage && $cpuUsage > floatval($config['useRatio'] / 100)) {
				$rest = $this->warnUsage($type, array('value' => $cpuUsage));
				if (!$rest) $data[$type] = $cpuUsage;
			}
		}
		// 内容不为空,获取系统消息
		if (empty($data)) return;

		// 4.拼接消息
		$text = LNG('msgWarning.main.msgSysErr');
		$base = array();
		if (isset($data['mem'])) {
			$ratio = ($data['mem']*100).'%';
			$base[] = sprintf($text, $config['useTime'], LNG('msgWarning.main.memory'), $config['useRatio'].'%', $ratio);
		}
		if (isset($data['cpu'])) {
			$ratio = ($data['cpu']*100).'%';
			$base[] = sprintf($text, $config['useTime'], 'CPU', $config['useRatio'].'%', $ratio);
		}

		// 获取系统消息,合并,发送
		$msg = Action($this->pluginName)->message(true);
		if (!$msg) $msg = array();
		$msg['base'] = $base;
		// 返回执行结果,写入计划任务日志。可在前端tools/table.log加入详情展示结果,暂不处理
		$result = Action($this->pluginName . '.msg.index')->send($msg, $target);
		$result['user'] = $target;
		return $result;
	}

	/**
	 * 记录cpu、内存异常信息
	 * @param [type] $type
	 * @param [type] $data
	 * @return void true:不发送;false:发送
	 */
	private function warnUsage($type, $data) {
		Model('SystemWarn')->init($type);
		$config = $this->getConfig();

		// 1.写入一条记录——超过99%的不写,且删除已有数据,直接发送(废弃)
		// if ($data['value'] > 0.99) {
		// 	$useTime = 0;
		// } else {
			$insert = array(
				'value'		=> $data['value'],
				'content'	=> !empty($data['data']) ? $data['data'] : ''
			);
			$data = Model('SystemWarn')->add($insert);
			$useTime = intval($config['useTime']);
		// }
		if (!$useTime || $useTime < 10) $useTime = 10; // 最小持续时长10分钟

		// 2.获取记录列表,删除指定时长之前的数据
		$list = Model('SystemWarn')->listData();
		$time = time() - 60 * $useTime;
		foreach($list as $k => $item) {
			$crtTime = intval($item['createTime']);
			if(!$useTime || $crtTime < $time) {
				Model('SystemWarn')->remove($item['id']);
				unset($list[$k]);
			}
		}

		// 3.判断是否符合发送提醒条件——持续的n分钟里,如20分钟,理论上有20条记录,只要达到80%(>=16条),就发送提醒
		$cnt = $useTime * 0.8;
		if(count($list) >= $cnt) {
			// 时间间隔需满足20分钟,避免每次都有数据写入时提前(16分钟)触发
			$max = reset($list);
			$min = end($list);
			$time = ceil(($max['createTime'] - $min['createTime'])/60);	// 持续记录数据时长(分钟)
			if ($time < $useTime) return true;

			// 每发送一次,删除此前的全部记录。持续时长=发送频率
			foreach($list as $k => $item) {
				Model('SystemWarn')->remove($item['id']);
			}
			// 最后发送时间
			Action($this->pluginName)->setConfig(array('lastSendTime' => time()));
			return false;
		}
		return true;
	}
	// 发送频率检测,每1小时发送一次
	private function canMsgSendNow ($config) {
		$lastTime = intval($config['lastSendTime']);
		if (!$lastTime) return true;
		$timeStart = strtotime(date('Y-m-d H:00:00'));
		if (Model('SystemOption')->get('versionType') == 'A') {
			$timeStart = strtotime(date('Y-m-d 00:00:00'));
		}
		return $lastTime < $timeStart;
	}

}

/**
 * mem、cpu记录
 */
class SystemWarnModel extends ModelBaseLight{
	public $optionType 	= '';
	public $modelType	= "SystemOption";
	public $field		= array('value','content'); //数据字段

	public function init($type){
		$this->optionType = 'System.'.$type.'WarnList';	// cpu、mem
	}
	//默认正序
	public function listData($id=false,$sort='modifyTime',$sortDesc=true){
		return parent::listData($id,$sort,$sortDesc);
	}
	public function remove($id){ 
		return parent::remove($id);
	}
	public function add($data){
		return parent::insert($data);
	}
}