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;
}
?>