회사는 Yii 프레임워크의 유연한 확장을 선호하므로 프로젝트에서는 원래 시스템과 호환되도록 Yii1.1 버전이 선택됩니다.
여기서는 yii의 기능에 대해 이야기하지 않고 주로 yii를 사용할 때 컬의 재캡슐화에 대해 이야기합니다.
먼저 yii 구성 파일을 살펴보고 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; } }
저작권 표시: 이 글은 해당 블로거의 원본 글이므로 복제할 수 없습니다. 블로거의 허락 없이.
위 내용은 관련 측면을 포함하여 yii11에서 CURL을 다시 캡슐화하는 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.