swoole服务端与客户端 异步任务

服务端: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('导入成功');
}

猜你喜欢

转载自blog.csdn.net/weixin_42433970/article/details/109653327