skymvc开发手册之队列任务的实现
查看视频教程或者获取有关《skymvc开发手册》更多信息

在php中由于执行某些操作比较耗时,而且不需要实时实现的,我们可以按照队列进行任务执行,常见的短信通知,邮件通知,消息推送等。

任务的执行过程:

1、将任务添加到队列中

2、获取任务

3、执行具体任务


<?php
class test_taskControl extends skymvc{
	
	public function __construct(){
		parent::__construct();
	}
	function is_cli(){
	    return preg_match("/cli/i", php_sapi_name()) ? true : false;
	}
	public function echoMsg($msg){
		if($this->is_cli()){
			echo  iconv("utf-8","gbk",$msg);
		}else{
			echo $msg;
		}
	}
	public function onDefault(){
		header("Content-type:text/html;charset=utf-8");
		set_time_limit(0);
		session_write_close();
		require "extends/queue/mysql.php";
		$que=new queue("mysql");
		ob_implicit_flush(); 
		while(true){
			$task=$que->rpop();
			if(!$this->is_cli()){
				echo str_repeat(" ", 44096);
			}
			 
			if(empty($task)){
				$this->echoMsg("任务全部完成");			
				ob_flush();
				flush();
				sleep(2);
			}else{
				
				switch($task["action"]){
					case "sendSms":
						$this->sendSms($task["data"]);
						 
						break;
					default:
						$this->echoMsg("执行任务");
						 
						break;
				}
			}
		}
		
		
	}
	public function sendSms($conf){
		$this->echoMsg("给".$conf["telephone"]."发送了一条短息".$conf["content"]);
	}
	public function onAdd(){
		require "extends/queue/mysql.php";
		$que=new queue("mysql");
		$que->lpush(array(
			"action"=>"sendSms",
			"data"=>array(
				"telephone"=>15985840591,
				"content"=>"deituiCMS祝您圣诞季快乐"
			)
		));
		echo "添加一个任务";
	}
}

通常我们需要这个队列任务一直执行下去,我们可以在单独文件中调用

在根目录新建一个task.php

在windows系统可以CMD运行 php task.php 不能关闭窗口

在linux系统可以运行 php task.php & 

<?php
error_reporting(E_ALL ^ E_NOTICE);
header("Content-type:text/html; charset=utf-8");
if(!file_exists("config/install.lock"))
{
	header("Location: install/");
	exit;
} 
require("config/config.php");
define("ROOT_PATH",  str_replace("\\", "/", dirname(__FILE__))."/");
define("CONTROL_DIR","source/index");
define("MODEL_DIR","source/model");
/*视图模版配置*/

require("./skymvc/skymvc.php");
//用户自定义初始化函数
function userinit(){
	 
	CC("test","test_task")->onDefault();
	exit; 
}

?>