<?php // 假设该服务在IP 123.12.12.43 上 // 启动命令,在文件目录执行 php push.php echo 'start_at: '. date('Y-m-d H:i:s') ."\r\n"; // 开启http服务,用于接收推送数据 $serv = new Swoole\Http\Server("0.0.0.0", 8082, SWOOLE_BASE); $serv->on('request', function ($req, $resp) { // 获取请求过来的参数列表 $openids = [1,2,3,4,5,6,7,8,9,10]; $params= [ 'openids' => json_encode($openids), 'push_content' => 111, 'url' => 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=', 'func' => 'wx_push', ]; $wg = new \Swoole\Coroutine\WaitGroup(); $result = []; // 结果信息 $result['start_at'] = microtime(true); // 记录开始时间 $result['num'] = 0; // 记录推送数量 switch ($params['func']) { case 'wx_push': // 数据验证 if (!isset($params['openids']) || !$params['openids'] || !isset($params['push_content']) || !$params['push_content'] || !isset($params['url']) || !$params['url'] ) { $result['params'] = $params; $result['err_msg'] = '参数异常!'; break; } $url_arr = parse_url($params['url']); // 解析url $params['openids'] = is_array($params['openids']) ? $params['openids'] : json_decode($params['openids'], 1); // 推送的用户ID 列表 $content = []; // 推送的内容 foreach ($params['openids'] as $k => $openid) { // 一次推送3000条,推送完成再推下一轮3000条 if ($k > 0 && $k % 10 == 0) { //挂起当前协程,等待所有任务完成后恢复 $wg->wait(); } $wg->add(); $result['num']++; // 记录推送数量 //启动第一个协程 go(function () use ($wg, &$result, $openid, $content, $url_arr) { $content['touser'] = $openid; if (is_array($content)) { $content = json_encode($content,JSON_UNESCAPED_UNICODE); } //启动一个协程客户端client,请求淘宝首页 $cli = new \Swoole\Coroutine\Http\Client('cy.huazhanhao.top', 82); $cli->setHeaders([ //'Host' => 'api.weixin.qq.com', 'Host' => 'cy.huazhanhao.top', 'Content-Length' => strlen($content), 'Content-type' => 'application/x-www-form-urlencoded', //'application/x-www-form-urlencoded', ]); $cli->set(['timeout' => 6]); // 设置请求超时时长 // 拼接请求地址和参数 $cli->post('/redis_mq/curl.php', $content); echo $cli->body . "\r\n"; // $result['body'][$openid] = $cli->body; // 获取返回结果信息 $cli->close(); $wg->done(); }); } break; case 'ali': break; default: $result['default'] = 'no function'; break; } // 挂起当前协程,等待所有任务完成后恢复 $wg->wait(); //var_dump($result); //这里 $result 包含了 2 个任务执行结果 $result['end_at'] = microtime(true); // 记录结束时间 $result['use_time'] = $result['end_at'] - $result['start_at']; // 记录结束时间 // $resp->end(json_encode($result)); // 返回数据 }); // 启用http服务 $serv->start();
访问 curl 127.0.0.1:8082