• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

yii11中对CURL的再封装

php 搞代码 3年前 (2022-01-23) 16次浏览 已收录 0个评论

Yii框架灵活的扩展受到公司的青睐,所以,项目中使用了yii,为了兼容原来的系统,依然选择了yii1.1的版本。

这里不讲yii的特性,主要说一说使用yii时对curl的再次封装。

先看看yii的配置文件,在main.php中将curl配置为Components。

       'components' => array(                // Curl库  调用:Yii::app()->curl         'curl' => array(            'class' => 'ext.curl.Curl',            'options' => array(                CURLOPT_HTTPHEADER => array('Expect:'),                CURLOPT_HEADER => '',            ),        ),

<?php/** * Curl wrapper for Yii * @author hackerone */class Curl extends CComponent{    private $_ch;    private $response;    // config from config.php    public $options;    // default config    private $_config = array(        CURLOPT_RETURNTRANSFER => true,        CURLOPT_FOLLOWLOCATION => true,        CURLOPT_HEADER         => false,        CURLOPT_VERBOSE        => true,        CURLOPT_AUTOREFERER    => true,        CURLOPT_CONNECTTIMEOUT => 30,        CURLOPT_TIMEOUT        => 30,        CURLOPT_SSL_VERIFYPEER => false,        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'    );    private function exec($url)    {        $this->setOption(CURLOPT_URL, $url);        $this->response = curl_exec($this->_ch);        if (!curl_errno($this->_ch)) {            if (isset($this->options[CURLOPT_HEADER]))            if ($this->options[CURLOPT_HEADER]) {                $header_size = curl_getinfo($this->_ch, CURLINFO_HEADER_SIZE);                return substr($this->response, $header_size);            }            return $this->response;        } else {            throw new CException(curl_error($this->_ch));            return false;        }    }    public function get($url, $params = array())    {        $this->setOption(CURLOPT_HTTPGET, true);        return $this->exec($this->buildUrl($url, $params));    }	/**	 * weimob 内部接口post请求专用	 *	 * 支持多维数组 和 文件上传	 *	 */	public function httpPostRequest($url,$data = array()){		$this->setOption(CURLOPT_POST, true);		$this->setOption(CURLOPT_POSTFIELDS, http_build_query($data));        return $this->exec($url);	}	/**	 * Curl 原生post请求发送方式	 *	 * 用于需要post无key参数、post文件等	 */    public function post($url, $data = array())    {        $this->setOption(CURLOPT_POST, true);		$this->setOption(CURLOPT_POSTFIELDS, $data);        return $this->exec($url);    }    public function put($url, $data, $params = array())    {        // write to memory/temp        $f = fopen('php://temp', 'rw+');        fwrite($f, $data);        rewind($f);        $this->setOption(CURLOPT_PUT, true);        $this->setOption(CURLOPT_INFILE, $f);        $this->setOption(CURLOPT_INFILESIZE, strlen($data));        return $this->exec($this->buildUrl($url, $params));    }    public function delete($url, $params = array())    {        $this->setOption(CURLOPT_RETURNTRANSFER, true);        $this->setOption(CURLOPT_CUSTOMREQUEST, 'DELETE');        return $this->exec($this->build/本2文来源[email protected]搞@^&代*@码2网搞gaodaima代码Url($url, $params));    }    public function buildUrl($url, $data = array())    {        $parsed = parse_url($url);        isset($parsed['query']) ? parse_str($parsed['query'], $parsed['query']) : $parsed['query'] = array();        $params = isset($parsed['query']) ? array_merge($parsed['query'], $data) : $data;        $parsed['query'] = ($params) ? '?' . http_build_query($params) : '';        if (!isset($parsed['path'])) {            $parsed['path']='/';        }        $parsed['port'] = isset($parsed['port'])?':'.$parsed['port']:'';        return $parsed['scheme'].'://'.$parsed['host'].$parsed['port'].$parsed['path'].$parsed['query'];    }    public function setOptions($options = array())    {        curl_setopt_array($this->_ch, $options);        return $this;    }    public function setOption($option, $value)    {        curl_setopt($this->_ch, $option, $value);        return $this;    }    public function setHeaders($header = array())    {        if ($this->isAssoc($header)) {            $out = array();            foreach ($header as $k => $v) {                $out[] = $k .': '.$v;            }            $header = $out;        }        $this->setOption(CURLOPT_HTTPHEADER, $header);        return $this;    }    private function isAssoc($arr)    {        return array_keys($arr) !== range(0, count($arr) - 1);    }    public function getError()    {        return curl_error($this->_ch);    }    public function getInfo()    {        return curl_getinfo($this->_ch);    }    public function getStatus()    {        return curl_getinfo($this->_ch, CURLINFO_HTTP_CODE);    }    // initialize curl    public function init()    {        try {            $this->_ch = curl_init();            $options = is_array($this->options) ? ($this->options + $this->_config) : $this->_config;            $this->setOptions($options);            $ch = $this->_ch;            // close curl on exit            @Yii::app()->onEndRequest = function() use(&$ch){                curl_close($ch);            };        } catch (Exception $e) {            throw new CException('Curl not installed');        }    }    public function getHeaders()    {        $headers = array();        $header_text = substr($this->response, 0, strpos($this->response, "\r\n\r\n"));        foreach (explode("\r\n", $header_text) as $i => $line) {            if ($i === 0) {                $headers['http_code'] = $line;            } else {                list ($key, $value) = explode(': ', $line);                $headers[$key] = $value;            }        }        return $headers;    }}

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了yii11中对CURL的再封装,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:yii11中对CURL的再封装
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址