Я пытаюсь получить некоторые данные из твиттера через PHP. Я использую плагин tmhOAuth, который можно найти здесь. https://github.com/themattharris/tmhOAuth/
Я написал свой код на основе файла примера «streaming.php», который также можно найти на приведенной выше странице github. Вот мой код:
require 'tmhOAuth.php';
$tmhOAuth = new tmhOAuth(array(
'consumer_key' => 'xxxhiddenxxx',
'consumer_secret' => 'xxxhiddenxxx',
'user_token' => 'xxxhiddenxxx',
'user_secret' => 'xxxhiddenxxx'
));
$method = 'http://stream.twitter.com/1/statuses/filter.json';
$params = array(
'follow' => '1307392917',
'count' => '5'
);
$tmhOAuth->streaming_request('POST', $method, $params, 'my_streaming_callback');
$tmhOAuth->pr($tmhOAuth);
Это не распечатывало никаких данных из твиттера, которые я хотел извлечь, а только показывало отладочную информацию, которую записывает команда pr ().
Пытаясь отладить, почему я не получил никаких данных, я вошел и добавил строку в tmhOAuth.php, чтобы я мог видеть, какую ошибку выдает cURL. Я сделал это с помощью
echo curl_error($C);
Ошибка, которую выдал cURL, была:
передача закрыта с оставшимися незавершенными данными чтения
Я провел некоторое исследование этой ошибки, но не могу найти ничего, что могло бы помочь. Было несколько вещей, которые я нашел относительно длины контента, но когда я копался в коде, я увидел, что автор tmhOAuth уже обратился к этим проблемам (и комментирование его исправлений не помогло).
Любая помощь?
Обновление 1 Вот информация об ответе, собранная с помощью curl_getinfo:
//Removed - an updated version is below
Обновление 2 Благодаря комментариям ниже я понял, что твиттер отправляет мне данные с кодировкой передачи: chunked. Я поместил эту строку в tmhOAuth.php, чтобы вытеснить фрагментированные данные:
curl_setopt($c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
Это сработало, несколько. Я больше не получаю никаких ошибок cURL, но мой обратный вызов WRITEFUNCTION по-прежнему никогда не вызывается - поэтому я никогда не получаю никаких фактических данных. Вот вывод моего объекта cURL снова:
[response] => Array
(
[content-length] => 0
[headers] => Array
(
[content_type] => text/html; charset=iso-8859-1
[server] => Jetty(6.1.25)
)
[code] => 416
[response] => 1
[info] => Array
(
[url] => http://stream.twitter.com/1/statuses/filter.json
[content_type] => text/html; charset=iso-8859-1
[http_code] => 416
[header_size] => 116
[request_size] => 532
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.118553
[namelookup_time] => 0.043927
[connect_time] => 0.070477
[pretransfer_time] => 0.07049
[size_upload] => 25
[size_download] => 0
[speed_download] => 0
[speed_upload] => 210
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0.118384
[redirect_time] => 0
[request_header] => POST /1/statuses/filter.json HTTP/1.0
User-Agent: themattharris' HTTP Client
Host: stream.twitter.com
Accept: */*
Authorization: OAuth oauth_consumer_key="xxxhiddenxxx", oauth_nonce="xxxhidden", oauth_signature="xxxhidden", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1308226585", oauth_token="xxxhiddenxxx", oauth_version="1.0"
Content-Length: 25
Content-Type: application/x-www-form-urlencoded
)
)
)
Обновление 3: Пара вещей, которые я до сих пор выяснил ... Я удалил параметры 'count' из моего запроса POST, и теперь страница, кажется, работает вечно. Я подумал, что это означает, что он просто загружает тонны и тонны данных, поэтому я поставил перерыв в функции обратного вызова потоковой передачи, настроенной так, чтобы она убивала страницу после 5 циклов.
Я сделал это и оставил на некоторое время. Примерно через 5 минут страница закончила загрузку и показала, какие данные я собрал. Похоже, я не получал данных каждый раз, когда он проходил - только символ конца строки. Таким образом, на каждую часть данных, которую я загружаю, уходит минута, и даже тогда единственными данными, которые отображаются, является символ конца строки. Weird? Это проблема с твиттером или проблема cURL?