The flexible expansion of the Yii framework is favored by the company, so Yii is used in the project. In order to be compatible with the original system, the Yii1.1 version is still chosen.
We not talking about the characteristics of yii here, mainly talking about the re-encapsulation of curl when using yii.
First take a look at the yii configuration file and configure curl as Components in main.php.
'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->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; } }
Copyright statement: This article is an original article by the blogger and may not be reproduced without the blogger's permission.
The above introduces the re-encapsulation of CURL in yii11, including the relevant aspects. I hope it will be helpful to friends who are interested in PHP tutorials.