2016-07-26 2 views
3

То, что я пытаюсь достичь:
Получить запрос к API Endpoint, извлекая в XML, а затем анализировать результаты.
Я посылаю запрос file_get_contents для достижения этого.file_get_contents не удается с помощью PHP, работает через браузер

Вопросы:

`file_get_Contents` fails, error: 

Warning: file_get_contents(https://api.twitter.com/1.1/statuses/mentions_timeline.json): 
failed to open stream: 
     A connection attempt failed because the connected party did not properly 
respond after a period of time, or established connection failed because 
connected host has failed to respond. 

Обновление 17/08

Чтобы закрепить свое нынешнее понимание:
1. PHP FAILS:
1.а это не удается с помощью PHP (тайм-аут)
1.b он не работает через командную строку (curl -G http://api.eve-central.com/api/quicklook?typeid=34)
1.c file_get_contents
1.d file_get_contents ж/create_stream_context

2. Что работает:
2.а Оклейка URL на вкладке хромированной
2б через почтальона

Произошли следующие попытки: - Проверить заголовки в почтовом отправителе и попытаться воспроизвести их через php

Postman Headers sent back by eve-central: 
Access-Control-Allow-Origin → * 
Connection → Keep-Alive 
Content-Encoding → gzip 
Content-Type → text/xml; charset=UTF-8 
Date → Wed, 17 Aug 2016 10:40:24 GMT 
Proxy-Connection → Keep-Alive 
Server → nginx 
Transfer-Encoding → chunked 
Vary → Accept-Encoding 
Via → HTTP/1.1 proxy10014 

Соответствующий код:

$headers = array(  
'method' => 'GET',   
'header' => 'Connection: Keep-Alive', 
'header' => 'Content-Encoding: gzip', 
'header' => 'Content-Type: text/xml', 
'header' => 'Proxy-Connection: Keep-Alive', 
'header' => 'Server: nginx', 
'header' => 'Transfer-Encoding: chunked', 
'header' => 'Vary: Accept-Encoding', 
'header' => 'Via: HTTP/1.1 proxy10014'); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_PORT , 8080); // Attempt at changing port in the event it was blocked. 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($curl, CURLOPT_POST,   false);    
curl_setopt($curl, CURLOPT_URL,   $url); 

$resp = curl_exec($curl); 
if(curl_error($curl)) 
{ 
echo 'error:' . curl_error($curl); 
} 
  • Использование Wireshark для захвата запроса GET, чтобы увидеть, если изменить порт помог
  • Run Curl с помощью командной строки
    Я из идей и опции. Вопрос:
    1. Если он работает в браузере и в Postman, то почему он не работает через PHP?
    2. Как я могу изменить свой код, чтобы он имитировал то, что делает Почтальон? ?

Предыдущие попытки То, что я пробовал: Различные варианты Curl от других потоков, таких как

function curl_get_contents($url) { 
$ch = curl_init(); 
if (!$ch) 
{ 
die("Couldn't initialize a cURL handle"); 
} else 
echo "Curl Handle initialized "; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
$data = curl_exec($ch); 
// Check if any error occurred 
if (!curl_errno($ch)) 
{ 
$info = curl_getinfo($ch); 
echo 'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], ""; 
displayData($info); 
} else 
echo "Failed Curl, reason: ".curl_error($ch)." "; 
curl_close($ch); 
return $data; 
} 

результат: ничего, никакие данные не возвращаются.
- Проверено на php.INI опции:
- allow_fopen Вкл
- allow_url_include = на
- соответствующих расширений SSL включены
- Воспитанный окно тайм-аута
- как через php.ini
- также с помощью явного указания в пределах php-файл.
- Попробовал с другим URL
- та же ошибка, так что это на самом деле не зависит от моей конкретной конечной
- например, как щебет/википедия/Google возвращает конкретную ошибку - попытался с:
- file_get_contents на локальный файл XML (https://msdn.microsoft.com/en-us/library/ms762271(v=vs.85).aspx) ->работы
- file_get_contents на удаленный файл XML (http://www.xmlfiles.com/examples/note.xml) ->не удается же ошибка
- В целом, справедливо следующее, до сих пор:
- завиток выходит из строя, тайм-аут
- file_get_contents выходит из строя, тайм-аут
- Open XML файл URL в браузере работает
- Сделать запрос GET через Почтальон, работает

Очевидно, что во всех случаях, когда file_get_contents сбой через php, я могу легко получить доступ к файлу через любой браузер.

Попытка решить проблему.
Попытка 1:
Используйте nitrous.io, создайте стек LAMP, выполните действие с помощью платформы Результаты: file_get_contents работает, однако, из-за большого количества xml-файлов, которые нужно извлечь, время работы. Ориентировочное решение:
- Загрузка XML-файлы из источника
- Zip их
- Скачать xml_file
- Локально разбор сказал XML файлы
Позже, писать небольшие скрипты, которые при вызове, выполняет биты выше, отправляет данные в локальный каталог, который затем распаковывает его и выполняет дополнительную работу над ним.
Другой попыткой было бы использовать Google Таблицы с пользовательской функцией, которая извлекает данные в лист и просто выгружает файл/значения excel в mysql.
Для моих целей, в то время как ужасно неосведомленное решение, оно делает трюк.

Код, используемый для предотвращения проблемы тайм-аута на совместном хосте:

function downloadUrlToFile2($url, $outFileName) 
{ 
    //file_put_contents($xmlFileName, fopen($link, 'r')); 
    //copy($link, $xmlFileName); // download xml file 
    ; 
    echo "Passing $url into $outFileName "; 
    // $outFileName = touch(); 
    $fp = fopen($outFileName, "w"); 
    if(is_file($url)) 
    { 
     copy($url, $outFileName); // download xml file 
    } else 
     { 
      $ch = curl_init(); 
      $options = array(
      CURLOPT_TIMEOUT => 28800, // set this to 8 hours so we dont timeout on big files 
      CURLOPT_URL  => $url 
     ); 

      curl_setopt($ch, CURLOPT_FILE, $fp); 
      curl_setopt_array($ch, $options); 
      $contents = curl_exec($ch); 
      fwrite($fp, $contents); 
      curl_close($ch); 
     } 
} 

Я также добавил это в верхней части ини сценария:

ignore_user_abort(true); 
set_time_limit(0); 
ini_set('memory_limit', '2048M'); 
+0

Вы пытаетесь получить данные без каких-либо аутентификации . Почему бы вам не попробовать одну из PHP-обложек для Twitter? https: //dev.twitter.com/overview/api/twitter-libraries – Nikhil

+0

Благодарим вас за ответ. URL-адрес Twitter был всего лишь одним из случайных URL-адресов, используемых для тестирования различных параметров. Результаты не изменяются, если вы делаете file_get_contents ($ url), с $ url: http://www.xmlfiles.com/examples/note.xml. Таким образом, как вы можете видеть из этого URL-адреса, это простой xml, без каких-либо требований, требуемых от любых видов, все еще не выполняется с ошибкой таймаута. – user3375601

+0

Где находится код? Вы поняли, что машина, на которой вы работаете, имеет прямое подключение к Интернету? (сервер может сидеть за превалирующим прокси). Он может разрешать имена? Что у него нет брандмауэра, предотвращающего этот доступ? Что он не ограничен другим механизмом безопасности? Вы проверяли журналы? Его общее для настройки хостов веб-серверов, чтобы предотвратить их создание исходящих подключений через Интернет по соображениям безопасности (и по умолчанию используется политика SELinux от Redhat). – symcbean

ответ

3

Я вижу некоторые проблемы с HTTPS URL запроса, для исправить проблему, вы должны добавить строки ниже в запросе CURL

function curl_get_contents($url) { 
    $ch = curl_init(); 
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
    $header[] = "Cache-Control: max-age=0"; 
    $header[] = "Connection: keep-alive"; 
    $header[] = "Keep-Alive: 300"; 
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
    $header[] = "Accept-Language: en-us,en;q=0.5"; 
    $header[] = "Pragma: "; 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 

    // I have added below two lines 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
} 
+1

Спасибо за это. Я использую вашу обратную связь и добавил еще несколько ошибок: Добавит код в исходный блок. Что интересно, это то, что локон таймаута, а также: Получение содержимого из http://www.xmlfiles.com/examples/note.xml Curl ручки инициализируется Failed Curl, причина: Тайм-аут соединения после 5008 миллисекунд – user3375601

Смежные вопросы