Предлагаю свой класс для курла, он умеет следующее:
- поддерживается цепочка вызовов
- сразу заданы user-agent и accept (их можно изменить вот так Curl::$ua = '----'; )
- применен паттерн singleton, тоесть возможен только один объект в сценарии
- автоматически разжимает gzip/deflate, при этом запрашивает сжатые данные (это экономит трафик раз в 10)
<?php echo Curl::init('http://ya.ru') ->referer('http://snippets.pp.ru') ->cookie('cookie.txt') ->exec(); class Curl { static $cookie; static $proxy; static $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.6.7 (.NET CLR 3.5.30729)'; static $accept = array( 'Accept' => 'application/xhtml+voice+xml;version=1.2, application/x-xhtml+voice+xml;version=1.2, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/JPEG, image/gif, image/x-xbitmap, *\\/*;q=0.1', 'Accept-Language' => 'ru, en', 'Accept-Charset' => 'windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1', 'Accept-Encoding' => 'gzip,deflate', ); private $ch; //идентификатор соединения protected static $instance; //переменная для singleton private $info; //переменная для информации о соеденении private $file; //переменная для файла //функция для инициализации public static function init($url='') { return (self::$instance === null) ? self::$instance = new self($url) : self::$instance; } //конструктор function __construct($url) { $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); if ($url) $this->url($url); return self::$instance; } //деструктор, закрывает соединение function __destruct() { if (!is_null(self::$instance)) $this->close(); } //обертка для сохранения файла function file($save) { curl_setopt($this->ch, CURLOPT_FILE, $this->file = fopen($save, 'w+b')); return self::$instance; } //обертка для закрытия соединения function close() { curl_close($this->ch); if (!is_null($this->file)) { fclose($this->file); $this->file = null; } return self::$instance = null; } //обертка для задания url function url($url) { curl_setopt($this->ch, CURLOPT_URL, $url); return self::$instance; } //обертка для установки прокси function proxy($proxy) { curl_setopt($this->ch, CURLOPT_PROXY, $proxy); return self::$instance; } //обертка для установки редиректов function followlocation($followlocation) { curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, $followlocation); return self::$instance; } //обертка для установки кукис function cookie($cookie) { self::$cookie = $cookie; if ($cookie) { curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookie); curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookie); } return self::$instance; } //обертка для установки реферера function referer($referer) { curl_setopt($this->ch, CURLOPT_REFERER, $referer); return self::$instance; } //обертка для получения информации о соединении function get_info() { return $this->info; } //обертка для задания пост данных $post = array(); function post($post) { $post = http_build_query($post, null, '&'); curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); return self::$instance; } //обертка для выполнения соединения function exec($close = true) { curl_setopt($this->ch, CURLOPT_USERAGENT, self::$ua); if (self::$cookie) $this->cookie(self::$cookie); if (self::$proxy) $this->proxy(self::$proxy); curl_setopt($this->ch, CURLOPT_HTTPHEADER, self::$accept); $exec = curl_exec($this->ch); $this->info = curl_getinfo($this->ch); //закрываем соединение если задано if ($close) $this->close(); return $this->extr($exec); } //функция разжимает gzip/deflate protected function extr($s) { return (substr($s, 0, 8) == "\x1F\x8B\x08\x00\x00\x00\x00\x00") ? gzinflate(substr($s, 10)) : $s; } } ?>