服务端:Server.php
在Linux服务器上直接执行:php Server.php 打开长链接
<?php
class Server
{
private $serv;
public function __construct()
{
$this->serv = new swoole_server("0.0.0.0", 9501);
$this->serv->set(array(
'worker_num' => 4, //一般设置为服务器CPU数的1-4倍
'daemonize' => 1, //以守护进程执行
'max_request' => 10000,
'dispatch_mode' => 2,
'task_worker_num' => 4, //task进程的数量
"task_ipc_mode " => 3, //使用消息队列通信,并设置为争抢模式
//"log_file" => "log/taskqueueu.log" ,//日志
));
$this->serv->on('Receive', array($this, 'onReceive'));
$this->serv->on('Task', array($this, 'onTask'));
$this->serv->on('Finish', array($this, 'onFinish'));
$this->serv->start();
}
public function onReceive(swoole_server $serv, $fd, $from_id, $data)
{
$serv->task($data);
}
public function onTask($serv, $task_id, $from_id, $data)
{
$array = json_decode($data, true);
$token = '';
if(isset($array['token'])){
$token = $array['token'];
}
$this->curl_request($array['url'], $array['data'],$token);
}
public function onFinish($serv, $task_id, $data)
{
}
//curl调用接口
protected function curl_request($url,array $data = [],$token = '')
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if($token){
curl_setopt($curl, CURLOPT_HTTPHEADER, ['token: '.$token]);
}
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}
$server = new Server();
客户端:Client.php
<?php
namespace app\admin\logic;
class Client
{
private $client;
//端口号
private $port = 9501;
public function __construct()
{
$this->client = new \swoole_client(SWOOLE_SOCK_TCP);
}
public function connect()
{
if (!$this->client->connect("127.0.0.1", $this->port, 1)) {
throw new \Exception(sprintf('Swoole Error: %s', $this->client->errCode));
}
}
public function send($data)
{
if ($this->client->isConnected()) {
if (!is_string($data)) {
$data = json_encode($data);
}
return $this->client->send($data);
} else {
throw new Exception('Swoole Server does not connected.');
}
}
public function close()
{
$this->client->close();
}
}
调用方式:
$arr['url'] = ConstGroup::DESIGNER_URL . '/v1/orderTemExport';//异步控制器
$arr['data'] = $params;//客户端传给控制器的参数
$client = new \app\admin\logic\Client();
$client->connect();
if ($client->send($arr)) {
$client->close();
ApiResponse::success('导入成功');
}