通常我们用到发送批量向用户发送邮件,或者微信通知的时候,如果数据量比较大,此时用php原始方法进行发送就会占用比较长的时候,通常用户这个等待的时间会比较长如果关闭页面,就会导致任务发送失败,所以这个时候用到PHPswoole的异步处理 Task的方法进行后台发送,就避免了用户等待的问题,交给后台处理就行了 。而通常有会设计到,在发送同时,可能也伴随着短信或者微信通知,这时候就想到了用进程异步去处理,也能加快通知的发送 。
在这里插入代码片
```<?php
use app\api\controller\Notice;
$serv = new Swoole\Server('127.0.0.1', 9507);
//设置异步任务的工作进程数量
$serv->set([
'task_worker_num' => 4,
'daemonize' =>false //守护进程
]);
//此回调函数在worker进程中执行
$serv->on('Receive', function ($serv, $fd, $reactor_id, $data) {
//投递异步任务
$task_id = $serv->task($data);
echo "Dispatch AsyncTask: id={$task_id}\n";
});
//处理异步任务(此回调函数在task进程中执行)
$serv->on('Task', function ($serv, $task_id, $reactor_id, $data) {
if ($data != '') {
$json_data = json_decode($data, true);
$url = $json_data['url']; //获取路径
$id = $json_data['id'];
$isvoice = $json_data['isvoice']; // 是否有语音通知 如果有启动进程拨打
if(isset($json_data['agin_id']) && $json_data['agin_id']!=''){
$agin_id = $json_data['agin_id'];
$result = curl_post2("http://test.yjglfwxt.cn/api/$url?id=$id&agin_id=$agin_id");
}else{
$zxurl ="http://api/$url?id=$id";
$process = new Swoole\Process(function (Swoole\Process $worker) use ($zxurl,$isvoice) {
$result = curl_post2($zxurl);
}, true);
$pid = $process->start();
// $result = curl_post2($zxurl);
}
if ($isvoice == '1') {
echo '444';
$process = new Swoole\Process(function (Swoole\Process $worker) use ($zxurl,$isvoice) {
// echo $zxurl;
$zxurl = $zxurl.'&isvoice='.$isvoice;
file_put_contents('swoolelog/logswooleces.txt', '4343总数' . $zxurl);
$result = curl_post2($zxurl);
}, true);
$pid = $process->start();
}
}
echo "New AsyncTask[id={$task_id}]" . PHP_EOL;
//返回任务执行的结果
$serv->finish("{$data} -> OK");
});
//处理异步任务的结果(此回调函数在worker进程中执行)
$serv->on('Finish', function ($serv, $task_id, $data) {
echo "AsyncTask[{$task_id}] Finish: {$data}" . PHP_EOL;
});
function curl_post2($url, $data = array(), $header = '')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// POST数据
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
if (!empty($header)) {
//print_r($header);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$serv->start();