Heim > Backend-Entwicklung > PHP-Tutorial > Neukapselung von CURL in yii11

Neukapselung von CURL in yii11

WBOY
Freigeben: 2016-07-29 09:15:38
Original
1285 Leute haben es durchsucht

Die flexible Erweiterung des Yii-Frameworks wird vom Unternehmen favorisiert, daher wird im Projekt Yii verwendet. Um mit dem Originalsystem kompatibel zu sein, wird weiterhin die Yii1.1-Version gewählt.

Wir werden hier nicht über die Funktionen von yii sprechen, sondern hauptsächlich über die erneute Kapselung von Curl bei Verwendung von yii.

Schauen Sie sich zunächst die yii-Konfigurationsdatei an und konfigurieren Sie Curl als Komponenten in main.php.

 

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

<?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->buildUrl($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;
    }

}
Nach dem Login kopieren

Urheberrechtserklärung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht reproduziert werden ohne die Erlaubnis des Bloggers.

Das Obige stellt die Neukapselung von CURL in yii11 vor, einschließlich der relevanten Aspekte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage