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