分享一个PHP使用CURL发送请求的工具类

工具类

class JsDataProjectHelper
{

    private $url = "http://www.baidu.com";
    private $post_data = [];

    public function __construct()
    {

    }


    private function sendPostRequest($base_url = '', $uri = '', $post_data = [], $header = [])
    {
        $data = [
            'code' => 200,
            'msg' => '请求成功',
            'data' => []
        ];

        $head = [
            'Content-Type: application/json; charset=utf-8',
            'Content-Length: ' . strlen(json_encode($post_data))
        ];

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $base_url . $uri);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);//超时
        curl_setopt($ch, CURLOPT_HEADER, false);
        if ($post_data != '') {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
        }
        if (!empty($header)) {
            $head = array_merge($head,$header);
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
        $file_contents = curl_exec($ch);


        $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        $error = curl_error($ch);
        curl_close($ch);

        if ($httpCode != 200) {
            //此处可打印日志
            //LogTool::getLogTool()->addLog('error',"curl",$base_url . $uri."|".$httpCode."|".$error);
        }

        if ($this->isJson($file_contents)) {
            $result = json_decode($file_contents, true);

            if ($result['code'] == 200) {
                $data['data'] = $result['result'];
            } else {
                $data['code'] = 500;
                $data['msg'] = $result['msg'];
            }
        } else {
            $data['code'] = 500;
            $data['msg'] = '网络请求失败';
        }

        return $data;
    }

    private function sendPostMultiRequest($post_data = [])
    {
        $datas = [];
        $multi_ch = curl_multi_init();
        $ch_list = [];

        //句柄处理
        foreach ($post_data as $requestName => $postData) {
            $head = [
                'Content-Type: application/json; charset=utf-8',
                'Content-Length: ' . strlen(json_encode($postData['post_data']))
            ];
            $ch_list[$requestName] = curl_init($postData['base_url'] . $postData['url']);
            curl_setopt($ch_list[$requestName], CURLOPT_POST, 1);
            curl_setopt($ch_list[$requestName], CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch_list[$requestName], CURLOPT_CONNECTTIMEOUT, 10);//超时
            curl_setopt($ch_list[$requestName], CURLOPT_HEADER, false);
            if ($postData['post_data'] != '') {
                curl_setopt($ch_list[$requestName], CURLOPT_POSTFIELDS, json_encode($postData['post_data']));
            }
            if (!empty($postData['header'])) {
                $head = array_merge($head,$postData['header']);
            }
            curl_setopt($ch_list[$requestName], CURLOPT_HTTPHEADER, $head);
            curl_multi_add_handle($multi_ch, $ch_list[$requestName]);
        }

        //执行
        $active = null;
        do {
            $mrc = curl_multi_exec($multi_ch, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        //同步阻塞优化CPU
        while ($active && $mrc == CURLM_OK) {
            if (curl_multi_select($multi_ch) != -1) { //阻塞直到cURL批处理连接中有活动连接。
                do {
                    $mrc = curl_multi_exec($multi_ch, $active);
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }

        while($done = curl_multi_info_read($multi_ch)) {}

        //获取http返回的结果
        foreach ($ch_list as $k => $ch) {
            $datas[$k] = [
                'code' => 200,
                'msg' => '请求成功',
                'data' => []
            ];

            $result = curl_multi_getcontent($ch);

            $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            if ($httpCode != 200) {
                //此处可以打印日志
                //LogTool::getLogTool()->addLog('error',"curl",$k."|".$httpCode."|".$error);
            }

            curl_multi_remove_handle($multi_ch, $ch);
            curl_close($ch);

            if ($this->isJson($result)) {
                $result = json_decode($result, true);

                if ($result['code'] == 200) {
                    $datas[$k]['data'] = $result['result'];
                } else {
                    $datas[$k]['code'] = 500;
                    $datas[$k]['msg'] = $result['msg'];
                }
            } else {
                $datas[$k]['code'] = 500;
                $datas[$k]['msg'] = '网络请求失败';
            }
        }

        curl_multi_close($multi_ch);

        return $datas;
    }

    private function isJson($str)
    {
        return !is_null(json_decode($str));
    }

    public function addRequest($requestName = '', ...$args)
    {
        try {
            $temp_requestName = explode('-', $requestName);
            $method = $temp_requestName[0];
            if (method_exists($this, "$method")) {
                $this->post_data[$requestName] = $this->$method(...$args);
                //$this->post_data[$requestName] = call_user_func([$this,$requestName],$args);
            } else {
                throw new \Exception($requestName . '() -- 函数不存在');
            }
        } catch (\Exception $e) {
            echo "<pre>";
            print_r($e->getMessage());
            die;
        }
        return $this;
    }

    public function commit()
    {
        if (count($this->post_data) == 1) {
            $this->post_data = array_values($this->post_data);
            $retData = $this->sendPostRequest($this->post_data[0]['base_url'], $this->post_data[0]['url'], $this->post_data[0]['post_data']);
            $this->post_data = [];
            return $retData['data'];
        } else {
            $ret = $this->sendPostMultiRequest($this->post_data);
            $data = [];
            foreach ($ret as $requestName => $response) {
                $data[$requestName] = $response['data'];
            }
            $this->post_data = [];
            return $data;
        }
    }

使用方式

在“JsDataProjectHelper”此类下新增需要调用的方法

public function a($a, $b = '')
    {
        $data = [
            'post_data' => ['a' => $a, 'b' => $b],
            'base_url' => $this->url,
            'url' => '/func/a',
        ];
        return $data;
    }
public function b($a)
    {
        $data = [
            'post_data' => ['a' => $a],
            'base_url' => $this->url,
            'url' => '/func/b',
        ];
        return $data;
    }

调用

$paramsA = 100;
$paramsB = "实例";
$JsDataHelper = new JsDataProjectHelper();
//单个请求调用
        $retdata = $JsDataHelper
            ->addRequest('a', $paramsA, $paramsB)
            ->commit();
        echo "<pre>";
        print_r($retdata);
//多个请求调用
        $retdata = $JsDataHelper
            ->addRequest('a', $paramsA, $paramsB)
            ->addRequest('b', $paramsA)
            ->commit();
        echo "<pre>";
        print_r($retdata);
//多请求相同调用
        $retdata = $JsDataHelper
            ->addRequest('a', $paramsA, $paramsB)
            ->addRequest('a-a1', $paramsA, $paramsB)
            ->addRequest('a-a2', $paramsA, $paramsB)
            ->addRequest('b', $paramsA)
            ->addRequest('b-b1', $paramsA)
            ->commit();
        echo "<pre>";
        print_r($retdata);
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

可以直接使用guzzlehttp/guzzle

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!