Aroused
@Aroused

PHP Curl Chunked Как записать результат в переменную?

Здравствуйте!
Подскажите, почему callback не записывает результат в переменную $server_output.
Спасибо за любую помощь!
// ...
	$response = getCurl($link, $headers, true);
	function getCurl($link, $headers, $chunked = false){
		if(!isset($link) || !isset($headers))
			{ print 'Error: getCurl argument'; die(); };
		$server_output = '';
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $link);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		if($chunked){
			curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $str){
				$server_output .= $str;
				// на этой строчке $server_output имеет только один последний чанк
				return strlen($str);
			});
			// на этой строчке $server_output уже пуста
			curl_exec($ch);
		}else{
			$server_output = curl_exec($ch);
		};
		curl_close($ch); return $server_output;
	};


и, если вынести callback в отдельную функцию, тоже ничего не пишет:

function getCurl($link, $headers, $chunked = false){
		if(!isset($link) || !isset($headers))
			{ print 'Error: getCurl argument'; die(); };
		$server_output = '';
		$callback = function($ch, $str){
			$server_output .= $str;
			return strlen($str);
		};
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $link);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		if($chunked){
			curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);
			curl_exec($ch);
		}else{
			$server_output = curl_exec($ch);
		};
		curl_close($ch); return $server_output;
	};
  • Вопрос задан
  • 1758 просмотров
Решения вопроса 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Попробуйте заменить на
global $server_output;
$GLOBALS["server_output"].=$str;

PS: для использования 'use' (и анонимных функций) необходимо PHP >=5.3.0
Ответ написан
Aroused
@Aroused Автор вопроса
Что бы не использовать глобальные переменные, реализовал через класс.
Может кому пригодится. Класс можно просто скопипастить.
(кастомные заголовки и поддержка chunked)
Всем спасибо!

// класс запроса
class Curl{
	// свойства
	var $link;
	var $headers;
	var $chunked = false;
	var $response = '';
	// метод запроса
	function GetRequest(){
		// ссылки свойств
		$link = &$this -> link;
		$headers = &$this -> headers;
		$chunked = &$this -> chunked;
		$response = &$this -> response;
		// логика метода
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $link);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		if($chunked){
			curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, 'Callback'));
			curl_exec($ch);
		}else{
			$response = curl_exec($ch);
		};
		curl_close($ch);
		$response = html_entity_decode($response, null, 'UTF-8');
		return $response;
	}
	// метод callback запроса
	function Callback($ch, $str){
		// ссылки свойств
		$response = &$this -> response;
		// логика метода
		$response .= $str;
		return strlen($str);
	}
};

// создаем экземпляр класса
$curlRequest = new Curl;
// параметры запроса
$curlRequest -> link = 'http://example.com/';
$curlRequest -> chunked = true; // true если тип ответа chunked
$curlRequest -> headers = Array(
	'Accept-Encoding: deflate, sdch',
	'User-Agent: Mozilla/5.0',
	'Accept: text/plain',
	'Cache-Control: no-cache',
);
// запрос
$curlRequest -> GetRequest();

// выводим ответ
print $curlRequest -> response;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@slavabars
Веб программист
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $str) use ($server_output){
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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