PHPcurl请求实例

Posted 我还是一个小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHPcurl请求实例相关的知识,希望对你有一定的参考价值。

phpcurl请求实例

话不多说,直接来实例

<?php

namespace rely\\curl;

use rely\\Facade;
use rely\\Init;


/**
 * Class Driver
 * @package rely\\curl
 * @author Mr.taochuang <mr_taochuang@163.com>
 * @date 2019/7/3 11:14
 * curl驱动类
 */
class Driver
{

    /**
     * @var object
     * curl对象
     */
    private static $curl = null;

    /**
     * @var \\rely\\init\\Config;
     * setopt 配置参数
     */
    private static $config;
    private static $init = [
        'timeout' => 60,
        'verifyhost' => 0,
        'sslcerttype' => 'PEM',
        'sslkeytype' => 'PEM',
        'verifypeer' => false
    ];
    /**
     * @var array
     * 设置的setopt
     */
    public static $setopt = [];
    /**
     * @var null
     * 请求url
     */
    public static $url = null;

    /**
     * @var int
     * 错误码
     * 1 成功
     * 2 无请求url
     */
    public $code = 1;

    /**
     * @var string
     * 错误信息
     */
    public $message = '';

    /**
     * @var
     * 响应状态
     */
    private $status;

    /**
     * @var
     * 响应数据
     */
    private $response;

    /**
     * @var
     * 处理后数据
     */
    private $data;

    /**
     * @var /网络缓存
     */
    public static $cache_curl;

    /**
     * Driver constructor.
     * @param array $config
     * 初始化curl
     */
    public function __construct($config = [])
    {
        self::$curl = curl_init();
        self::$config = (new \\ReflectionClass(Facade::bind('config')))->newInstanceArgs([array_merge(self::$init, $config)]);
    }
    //此处用到的类的反射,有想了解的大佬可以看下下面链接的文章

    /**
     * @param null $url url地址
     * 注册url地址
     */
    public function instance($url = null)
    {
        if (is_null($url)) {
            $this->code = 2;
            $this->message = '请填写请求地址http://xxxxxxx 或 https://xxxxxx';
        } else {
            self::$url = $url;
        }
        return $this;
    }

    /**
     * @param array $param
     * @return int
     * get 请求
     */
    public function get($param = [])
    {
        if (!empty($param)) self::$url .= (stripos(self::$url, '?') !== false ? '&' : '?') . http_build_query(Init::dataswitch()->toArray($param));
        return self::request();
    }

    /**
     * @param $param /请求参数
     * @param $type /请求类型 array json xml
     * @return int
     * post请求
     */
    public function post($param, $type = 'array')
    {
        $dataswitch = Init::dataswitch();
        if ($type == 'array') $param=http_build_query($dataswitch->toArray($param));
        if ($type == 'json') $param=$dataswitch->toJson($param);
        if ($type == 'xml') $param=$dataswitch->toXml($param);
        self::setopt([CURLOPT_POST, true], [CURLOPT_POSTFIELDS, $param]);
        return self::request();
    }

    /**
     * @param $param /请求参数
     * @return int
     * 文件请求
     */
    public function file($param)
    {
        if (!is_array($param)) $param = Init::dataswitch()->toArray($param);
        $build = true;
        foreach ($param as $key => $value) if (is_object($value) && $value instanceof \\CURLFile) {
            $build = false;
        } elseif (is_object($value) && isset($value->datatype) && $value->datatype === 'MY_CURL_FILE') {
            $build = false;
            $mycurl = new File((array)$value);
            $param[$key] = $mycurl->get();
            array_push(self::$cache_curl, $mycurl->tempname);
        } elseif (is_string($value) && class_exists('CURLFile', false) && stripos($value, '@') === 0) {
            if (($filename = realpath(trim($value, '@'))) && file_exists($filename)) {
                $build = false;
                $param[$key] = File::createCurlFile($filename);
            }
        }
        self::setopt([CURLOPT_POST, true], [CURLOPT_POSTFIELDS, $build ? http_build_query($param) : $param]);
        return self::request();
    }

    /**
     * @return int
     * 发送请求
     */
    private function request()
    {
        self::setopt([CURLOPT_URL, !empty(self::$config->get('url')) ? self::$config->get('url') : self::$url],
            [CURLOPT_TIMEOUT, self::$config->get('timeout')],
            [CURLOPT_HEADER, false],
            [CURLOPT_RETURNTRANSFER, true],
            [CURLOPT_SSL_VERIFYPEER, self::$config->get('verifypeer')],
            [CURLOPT_SSL_VERIFYHOST, self::$config->get('verifyhost')]);
        foreach (self::$setopt as $maps) {
            curl_setopt(self::$curl, $maps[0], $maps[1]);
        }
        list($this->response, $this->status) = [curl_exec(self::$curl), curl_getinfo(self::$curl)];
        $this->data = (intval($this->status["http_code"]) === 200) ? $this->response : curl_errno(self::$curl);
        curl_close(self::$curl);
        return $this->data;
    }

    /**
     * 设置代理
     * @param $Host /ip
     * @param $Port /端口
     */
    public function proxy($Host, $Port)
    {
        self::setopt([CURLOPT_PROXY, $Host], [CURLOPT_PROXYPORT, $Port]);
        return $this;
    }

    /**
     * 请求ssl配置
     * @param $ssl_cer
     * @param $ssl_key
     */
    public function ssl($ssl_cer, $ssl_key)
    {
        self::setopt([CURLOPT_SSLCERTTYPE, self::$config->get('sslcerttype')], [CURLOPT_SSLCERT, $ssl_cer], [CURLOPT_SSLKEYTYPE, self::$config->get('sslkeytype')], [CURLOPT_SSLKEY, $ssl_key]);
        return $this;
    }

    /**
     * 设置HTTP用户代理标头
     * @param $agent
     * @return $this
     */
    public function useragent($agent)
    {
        self::setopt([CURLOPT_USERAGENT, $agent]);
        return $this;
    }

    /**
     * 设置setpot
     * 此处可以设置curl多参数
     * key=>value对模式设计
     * 例见useragent方法
     */
    public function setopt()
    {
        foreach (func_get_args() as $maps) {
            self::$setopt[$maps[0]] = $maps;
        }
    }

}

PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function

附config类

<?php

namespace rely\\init;

/**
 * Class Config
 * @package rely\\curl
 * @author Mr.taochuang <mr_taochuang@163.com>
 * @date 2019/7/3 11:25
 * 配置类
 */
class Config implements \\ArrayAccess
{

    /**
     * @var array
     * 配置信息
     */
    private static $config = [];

    /**
     * @param $config
     * 配置初始化
     */
    public function __construct($config=[])
    {
        self::$config = array_merge(self::$config, $config);
    }

    /**
     * @param string|null $field
     * @return array
     * 获取config配置参数
     */
    public static function get(string $field = null)
    {
        if (is_null($field)) return self::$config;
        return isset(self::$config[$field]) ? self::$config[$field] : null;
    }

    /**
     * @param string $field
     * @param $value
     * @return $this
     * 设置config参数
     */
    public  function set(string $field, $value)
    {
        self::$config[$field] = $value;
        return $this;
    }

    /**
     * @param string $field
     * @return bool
     * 判断config配置是否存在
     */
    public static function has(string $field):bool
    {
        return !is_null($this->get($field));
    }
    /**
     * 设置配置变量
     * @access public
     * @param string $field  参数名
     * @param mixed  $value 值
     */
    public function __set(string $field, $value): void
    {
        $this->set($field, $value);
    }

    /**
     * 获取配置变量
     * @access public
     * @param string $field 参数名
     * @return mixed
     */
    public function __get(string $field)
    {
        return $this->get($field);
    }
    /**
     * @param mixed $field
     * @param mixed $value
     * ArrayAccess
     */
    public function offsetSet($field, $value): void
    {
        $this->set($field, $value);
    }

    public function offsetExists($field): bool
    {
        return $this->has($field);
    }

    public function offsetUnset($field)
    {
        throw new \\Exception('not support: unset');
    }

    public function offsetGet($field)
    {
        return $this->get($field);
    }
    /**
     * ArrayAccess
     */

}```

以上是关于PHPcurl请求实例的主要内容,如果未能解决你的问题,请参考以下文章

nginx拦截请求修改返回数据

Notifo使用PHPCURL和Jquery订阅请求

常用的基础方法,对象转数组,phpcurl请求

php curl请求返回'405 Not Allowed',有没有其他的抓取方法?

使用 PHP curl 发送 xml 请求

创建片段而不从 java 代码实例化它