Предупреждение: file_get_contents: не удалось открыть поток: достигнут предел перенаправления, отмена

Я прочитал более 20 связанных вопросов на этом сайте, искал в Google, но безрезультатно. Я новичок в PHP и использую PHP Simple HTML DOM Parser для получения URL-адреса. Хотя этот скрипт работает с локальными тестовыми страницами, он просто не будет работать с URL-адресом, для которого мне нужен скрипт.

Вот код, который я написал для этого, следуя примеру файла, поставляемого с библиотекой парсера PHP Simple DOM:

<?php

include('simple_html_dom.php');

$html = file_get_html('http://www.farmersagent.com/Results.aspx?isa=1&name=A&csz=AL');

foreach($html->find('li.name ul#generalListing') as $e)
echo $e->plaintext;  

?>

И это сообщение об ошибке, которое я получаю:

Warning: file_get_contents(http://www.farmersagent.com/Results.aspx?isa=1&amp;name=A&amp;csz=AL) [function.file-get-contents]: failed to open stream: Redirection limit reached, aborting in /home/content/html/website.in/test/simple_html_dom.php on line 70

Подскажите, пожалуйста, что нужно сделать, чтобы все заработало. Я новичок, поэтому, пожалуйста, предложите простой способ. Читая другие вопросы и ответы на них на этом сайте, я попробовал метод cURL для создания дескриптора, но мне не удалось заставить его работать. Метод cURL, который я пробовал, продолжает возвращать «Ресурсы» или «Объекты». Я не знаю, как передать это в Simple HTML DOM Parser, чтобы заставить $html->find() работать правильно.

Пожалуйста помоги! Спасибо!


person Chandan Mishra    schedule 28.08.2012    source источник
comment
Я получаю 200 OK, вообще никакого перенаправления, когда пытаюсь получить доступ к этому файлу...   -  person Niet the Dark Absol    schedule 28.08.2012
comment
Привет, Колинк! Спасибо за ваш комментарий. Странно, что он показывает ошибку 500 на моем ПК с Windows, и когда я запускаю его на своем сервере Linux, он показывает это сообщение об ошибке.   -  person Chandan Mishra    schedule 28.08.2012
comment
@ChandanMishra, было бы хорошо, если бы вы выбрали один из ответов и отметили его как правильный, если он решил вашу проблему, хорошо?   -  person Please_Dont_Bully_Me_SO_Lords    schedule 23.02.2018


Ответы (5)


Сегодня была аналогичная проблема. Я использовал CURL, и он не возвращал никаких ошибок. Протестировано с помощью file_get_contents(), и я получил...

не удалось открыть поток: достигнут предел перенаправления, прерывание в

Сделал несколько поисков, и я закончил с этой функцией, которая работает в моем случае...

function getPage ($url) {


$useragent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36';
$timeout= 120;
$dir            = dirname(__FILE__);
$cookie_file    = $dir . '/cookies/' . md5($_SERVER['REMOTE_ADDR']) . '.txt';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_ENCODING, "" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_AUTOREFERER, true );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout );
curl_setopt($ch, CURLOPT_MAXREDIRS, 10 );
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/');
$content = curl_exec($ch);
if(curl_errno($ch))
{
    echo 'error:' . curl_error($ch);
}
else
{
    return $content;        
}
    curl_close($ch);

}

Веб-сайт проверял наличие действительного пользовательского агента и файлов cookie.

Причиной этого была проблема с файлами cookie! :) Мир!

person PJunior    schedule 29.07.2015
comment
Хороший, работает и в моем случае. Вы сэкономили мне много времени, спасибо! - person Cheslab; 10.04.2016
comment
Если вы вернетесь, curl_close никогда не произойдет. это намеренно? Если это так, вы должны переместить curl_close в блок curl_errno. - person Funkodebat; 30.03.2018
comment
Здорово!! Файл cookie был недостающим параметром для моего случая. Большое спасибо! - person Diego Galocha; 19.04.2021
comment
Прекрасная работа! Спасибо. - person mscdeveloper; 10.06.2021

Решено с помощью:

<?php
$context = stream_context_create(
    array(
        'http' => array(
            'max_redirects' => 101
        )
    )
);
$content = file_get_contents('http://example.org/', false, $context);
?>

Вы также можете сообщить, если у вас есть прокси посередине:

$aContext = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
$cxContext = stream_context_create($aContext);

Подробнее о: https://cweiske.de/tagebuch/php-redirection-limit-reached.htm (спасибо @jqpATs2w)

person Please_Dont_Bully_Me_SO_Lords    schedule 29.08.2016
comment
Ответ более подробно описан на cweiske.de/tagebuch/php-redirection-limit-reached. htm - person jgpATs2w; 02.07.2018

Используя cURL, вам нужно будет установить для параметра CURLOPT_RETURNTRANSFER значение true, чтобы вернуть тело запроса с вызовом curl_exec следующим образом:

$url = 'http://www.farmersagent.com/Results.aspx?isa=1&name=A&csz=AL';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// you may set this options if you need to follow redirects. Though I didn't get any in your case
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$content = curl_exec($curl);
curl_close($curl);

$html = str_get_html($content);
person Mike Brant    schedule 28.08.2012
comment
Привет Майк, Спасибо за ответ! Я пробовал это, но я просто не знаю, как передать дескриптор cURL парсеру DOM, чтобы метод find() начал работать. Я попробовал этот код, но, пожалуйста, посмотрите, как он должен быть написан, потому что этот код возвращает предупреждение и фатальную ошибку (Фатальная ошибка: вызов функции-члена find() для не-объекта): - person Chandan Mishra; 28.08.2012
comment
@ChandanMishra Я не знаком с используемой вами библиотекой, но, просматривая документацию, вы найдете функцию для заполнения объекта DOM из строки, которую вы получите от cURL. Пожалуйста, смотрите мой пересмотренный ответ выше. - person Mike Brant; 28.08.2012
comment
После попытки str_get_html($content) я получаю Неустранимая ошибка: Неустранимая ошибка: вызов функции-члена find() для не-объекта в /home/content/html/website.in/test/test.php в строке 21 Что может быть причиной этого? - person Chandan Mishra; 28.08.2012
comment
@ChandanMishra Я не знаю, пытались ли вы делать дампы переменных, чтобы увидеть, где происходит сбой процесса (т. Е. Вы не получили результат скручивания, объект DOM не был создан и т. д.). - person Mike Brant; 28.08.2012
comment
Привет Майк, var_dump() для $content возвращает False. - person Chandan Mishra; 28.08.2012
comment
После вашего вызова curl_exec() добавьте это var_dump(curl_error($this->curl)), чтобы увидеть, какую ошибку получает curl. - person Mike Brant; 28.08.2012
comment
Привет, Майк, я попробовал это, но он генерирует новую фатальную ошибку. Использование $this, когда не в контексте объекта. Между тем, я попробовал этот код, и он показывает вывод: Объект перемещен ЗДЕСЬ и ЗДЕСЬ связан с %2fErrorPage.aspx%3faspxerrorpath%3d%2fResults.aspx. ссылка Извините за внешнюю ссылку. Не совсем знаком с форматированием комментариев на этом сайте. - person Chandan Mishra; 28.08.2012
comment
Когда я пытаюсь проанализировать загрузку страницы с помощью вкладки «Сеть» Firebug, первый ответ, который он получает, — это 200, но самый второй ответ — 302 для Google Maps. Это вызывает проблемы? - person Chandan Mishra; 28.08.2012
comment
@ChandanMishra Извините, я не хотел вставлять туда $this->curl, должно быть просто $curl. Я так привык работать с дескриптором curl, хранящимся внутри класса, что, кажется, набрал его по привычке. - person Mike Brant; 28.08.2012
comment
Не беспокойся. :) Попробовал еще раз после исправления ошибки. var_dump($content) выводит это: string(31) Максимум (20) перенаправлений, за которыми следует bool(false) - person Chandan Mishra; 28.08.2012
comment
@ChandanMishra Я не уверен, почему вы получаете все эти перенаправления. Я не вижу его в браузере. Что-то странное есть на этом сайте. - person Mike Brant; 28.08.2012
comment
Должен ли я попробовать установить пользовательский агент для cURL? Я думаю, что сайт имеет разные настройки для разных пользовательских агентов. - person Chandan Mishra; 28.08.2012
comment
Это может быть так. Используйте 1_ - person Mike Brant; 28.08.2012
comment
Казалось, это сработало. Скрипт по-прежнему не работает, но теперь var_dump($content) показывает: string(223513) и HTML-документ начинает загружаться в окне браузера. Это происходит, даже если я делаю print_r($content). Но я пытался использовать $html = str_get_html($content); а затем выполнение foreach($html-›find('li.name ul#generalListing') as $e) echo $e-›plaintext по-прежнему не работает. - person Chandan Mishra; 29.08.2012

Мне также нужно было добавить эти параметры контекста HTTP ignore_errors :

см.: https://www.php.net/manual/en/context.http.php

$arrContextOptions = array(
    "ssl" => array(
        // skip error "Failed to enable crypto" + "SSL operation failed with code 1."
        "verify_peer" => false,
        "verify_peer_name" => false,
         ),
     // skyp error "failed to open stream: operation failed" + "Redirection limit reached"
     'http' => array(
          'max_redirects' => 101,
          'ignore_errors' => '1'
      ),
           
  );

  $file = file_get_contents($file_url, false, stream_context_create($arrContextOptions));

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

person Sébastien Gicquel    schedule 13.01.2021

Я точно не знаю, почему вы переопределили объект $html со строкой из get html. Объект предназначен для использования для поиска строки. Если вы перезапишете объект строкой, объект больше не будет существовать и его нельзя будет использовать.

В любом случае, для поиска строки, возвращаемой из curl.

<?php
$url = 'http://www.example.com/Results.aspx?isa=1&name=A&csz=AL';

include('simple_html_dom.php');

# create object
$html = new simple_html_dom();

#### CURL BLOCK ####

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
# you may set this options if you need to follow redirects.
# Though I didn't get any in your case
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

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

# note the variable change.
$string = str_get_html($content);

# load the curl string into the object.
$html->load($string);

#### END CURL BLOCK ####

# without the curl block above you would just use this.
$html->load_file($url);

# choose the tag to find, you're not looking for attributes here.
$html->find('a');

# this is looking for anchor tags in the given string.
# you output the attributes contents using the name of the attribute.
echo $html->href;
?>

возможно, вы ищете другой тег, метод тот же

# just outputting a different tag attribute
echo $html->class;

echo $html->id;
person Chris    schedule 01.04.2013