Задать вопрос

Как заставить cURL выдавать результат, а не выводить на экран?

С удивлением обнаружил, что обычный curl_exec выводит результат на экран, не смотря на CURLOPT_RETURNTRANSFER.

Код:
public function getHTML($url){
        if(!isset($this->curl) || is_null($this->curl))
        {
            $this->init();
        }  
        curl_setopt($this->curl, CURLOPT_URL, $url);
        $page = curl_exec($this->curl);
        $this->close();
        return $page;
    }

protected function init(){
        $this->curl = curl_init();
        $this->setOptions();
        curl_setopt_array($this->curl, $this->options);
    }

private function setOptions(){
        if(empty($this->options))
        {
            $this->options = array(
                    CURLOPT_AUTOREFERER => true,
                    CURLOPT_COOKIESESSION => false,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_HTTPGET => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_BINARYTRANSFER => true,
                    CURLOPT_ENCODING => 'gzip,deflate,sdch',
                    CURLOPT_HTTPHEADER => array(
                            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3',
                            'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
                            'Cache-Control: max-age=0'
                    ),
                    CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7'
            );
            
            if($this->cookie){
                $this->options[CURLOPT_COOKIEFILE] = "cookie.txt";
                $this->options[CURLOPT_COOKIEJAR] = "cookie.txt";
            }
        }    
    }


Думать было некода. Я вставил такой костыль:

ob_start();
curl_exec($this->curl);
$this->close();
$page = ob_get_contents();
ob_clean();


Но при переносе проекта на боевой сервер оказалось, что там curl_exec уже не выводит на экран, а снова нужно старую версию включать.

Вопроса два:
Как сделать что бы работало и там и там?
Что я делал не так?

P.S. Версии php
на первом сервере:
PHP 5.5.9-1ubuntu4.11 (cli) (built: Jul  2 2015 15:23:08) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

на втором:

PHP 5.5.22 (cli) (built: Feb 26 2015 16:05:53) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
  • Вопрос задан
  • 12232 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Iktash
@Iktash Автор вопроса
Уф. Попробовал предложенную функцию - работает. Пробую свою - не работает. Пол ночи думал, в чем тут дело и так и этак крутил, вроде все одинаково.
Не знаю, что это за магия, но оказалось, что вот так работает:
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,


в обратном порядке нет:
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,


Порядок других опций, вроде роли не играет. Что за магия такая не понятно. Притом, как я писал вначале на одном сервере и так и этак работает, а на другом вот такая штука.

В итоге рабочая версия установки опций выглядит так:
private function setOptions(){
        if(empty($this->options))
        {
            $this->options = array(
                    CURLOPT_AUTOREFERER => true,
                    CURLOPT_COOKIESESSION => false,
                    CURLOPT_HTTPGET => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_BINARYTRANSFER => true,
                    CURLOPT_ENCODING => 'gzip,deflate,sdch',
                    CURLOPT_HTTPHEADER => array(
                            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3',
                            'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
                            'Cache-Control: max-age=0'
                    ),
                    CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7'
            );
            
            if($this->cookie){
                $this->options[CURLOPT_COOKIEFILE] = "cookie.txt";
                $this->options[CURLOPT_COOKIEJAR] = "cookie.txt";
            }
        }    
    }


Может кто-нибудь обьяснит в чем тут фишка?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xDireX
@xDireX
Мой маленький хелпер :-)
function sendRequest($url, $fields = [], $method = 'get', $config = []) {
        $fields = http_build_query($fields);

        // http://php.net/manual/ru/function.curl-setopt.php
        $_config = [
            CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
            CURLOPT_COOKIEFILE => 'cookie.txt',
            CURLOPT_COOKIEJAR => 'cookie.txt',
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HEADER => '',
            CURLOPT_TIMEOUT => 30,
            CURLOPT_AUTOREFERER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
        ];

        if ($method == 'post') {
            $_config[CURLOPT_POSTFIELDS] = $fields;
            $_config[CURLOPT_POST] = true;
        }

        foreach ($config as $key => $value) {
            $_config[$key] = $value;
        }

        $curl = curl_init();
        curl_setopt_array($curl, $_config);

        $response = curl_exec($curl);
        curl_close($curl);

        return $response;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы