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 appadminlogic;

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 appadminlogicClient();
$client->connect();
if ($client->send($arr)) {
          
   
    $client->close();
    ApiResponse::success(导入成功);
}
经验分享 程序员 微信小程序 职场和发展