То, что я пытаюсь достичь:
Получить запрос к 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 с помощью командной строки
Я из идей и опции. Вопрос:- Если он работает в браузере и в Postman, то почему он не работает через PHP?
- Как я могу изменить свой код, чтобы он имитировал то, что делает Почтальон? ?
Предыдущие попытки То, что я пробовал: Различные варианты 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');
Вы пытаетесь получить данные без каких-либо аутентификации . Почему бы вам не попробовать одну из PHP-обложек для Twitter? https: //dev.twitter.com/overview/api/twitter-libraries – Nikhil
Благодарим вас за ответ. URL-адрес Twitter был всего лишь одним из случайных URL-адресов, используемых для тестирования различных параметров. Результаты не изменяются, если вы делаете file_get_contents ($ url), с $ url: http://www.xmlfiles.com/examples/note.xml. Таким образом, как вы можете видеть из этого URL-адреса, это простой xml, без каких-либо требований, требуемых от любых видов, все еще не выполняется с ошибкой таймаута. – user3375601
Где находится код? Вы поняли, что машина, на которой вы работаете, имеет прямое подключение к Интернету? (сервер может сидеть за превалирующим прокси). Он может разрешать имена? Что у него нет брандмауэра, предотвращающего этот доступ? Что он не ограничен другим механизмом безопасности? Вы проверяли журналы? Его общее для настройки хостов веб-серверов, чтобы предотвратить их создание исходящих подключений через Интернет по соображениям безопасности (и по умолчанию используется политика SELinux от Redhat). – symcbean