抽离耗时任务 独立任务等待 (发送短信、邮件等)
优化独立任务类
class Http{
CONST HOST="0.0.0.0";
CONST PORT=8811;
//定义一个属性 保存服务链接句柄
public $http = null;
//构造函数 初始化websocket服务连接
public function __construct(){
$this->http = new swoole_http_server(self::HOST,self::PORT);//创建服务
$this->http->set([
'worker_num'=>4,//定义worker数
'task_worker_num'=>4,//定义tasker数
"enable_static_handler"=>true,//允许静态化目录
"document_root" =>"/swoole/project/live/thinkphp5.1/public/static",//静态化目录地址
]);
$this->http->on('workerstart',[$this,'onWorkerStart']);//服务准备前的一个初始化加载 tp的入口配置可以再次设置
$this->http->on('request',[$this,'onRequest']);//用户请求的一个反馈
$this->http->on("task",[$this,'onTask']);//监听任务分配 发短信、邮箱等消耗时间任务用方法来处理
$this->http->on('finish',[$this,'onFinish']);//task事件后的的一个处理
$this->http->on('close',[$this,'onClose']);//关闭事件
$this->http->start();//服务的开启
}
/**
* WorkerStart的回调
* @param $server
* @param $worker_id
*/
public function onWorkerStart($server,$worker_id){
define('APP_PATH', __DIR__ . '/../application/');
// 加载基础文件
// require __DIR__ .'/../thinkphp/base.php';
require __DIR__ .'/../thinkphp/start.php';
}
/**
* Request的回调
* @param $request
* @param $response
*/
public function onRequest($request,$response){
//请求服务转换
$_SERVER = [];
if(isset($request->server)){
foreach($request->server as $k=>$v){
$_SERVER[strtoupper($k)] = $v;
}
}
//请求头文件转换
if(isset($request->header)){
foreach($request->header as $k=>$v){
$_SERVER[strtoupper($k)] = $v;
}
}
//请求GET
$_GET = [];
if(isset($request->get)){
foreach($request->get as $k=>$v){
$_GET[$k] = $v;
}
}
//请求POST
$_POST = [];
if(isset($request->post )){
foreach($request->post as $k=>$v){
$_POST[$k] = $v;
}
}
//这一个配置 是让用户请求是能调用的本类的实体对象 可以调用task
$_POST['http_server'] = $this->http;
//用户请求的一个时间打印测试
echo date('Y-m-d H:i:s').'request'.PHP_EOL;
//把thinkphp的run 放到缓冲区,输入到用户界面
ob_start();
try{
think\Container::get('app', [APP_PATH])
->run()
->send();
}catch(\Exception $e){
}
$res = ob_get_contents();
ob_end_clean();
$response->end($res);
}
public function onTask($serv,$taskId,$workerId,$data){
//把task剥离出来
$obj = new app\common\lib\task\Task;
$method = $data['method'];
$flag = $obj->$method($data['data']);
return $flag;
}
public function onFinish($serv,$taskId,$data){
echo "taskId:{$taskId}--finish-data-sucess:{$data}".PHP_EOL;
}
public function onClose($serv,$fd){
echo "clientid:{$fd}".PHP_EOL;
}
}
$http = new Http();