Я пишу простой искатель, который извлекает ссылки на статьи из engadget.com и для каждой статьи я сохранить весь документ HTMLWeb ползать с помощью PHP
$target_url = "http://www.engadget.com/all/page/1/";
$html = new simple_html_dom();
$html->load_file($target_url);
foreach($html->find('script') as $script){
if($script->type == "application/ld+json"){
$json_data = strip_tags($script);
if($content = json_decode($json_data)){
$listElements = $content->itemListElement;
foreach($listElements as $element){
echo "Running..";
$article_url = $element->url;
$article_page = new simple_html_dom();
try{
$article_page->load_file($article_url);
} catch (Exception $e) {
sleep(20);
$article_page->load_file($article_url);
} finally {
$filename = "raw_file".$file_num.".txt";
$file = fopen("C:\\xampp\\htdocs\\files\\".$filename,"w");
fwrite($file, $article_page);
fclose($file);
$file_num++;
}
}
}
}
}
В большинстве случаев это работает нормально, но иногда страницы не загружается, и я получаю ошибку 503. Чтобы решить эту проблему, в настоящее время я приостанавливаю выполнение в течение 20 секунд, прежде чем повторять попытку с тем же URL. Это значительно сократило случаи сбоев, но иногда оно также не срабатывает во второй попытке. Есть ли лучший способ убедиться, что я получу данные со страницы. Есть ли способ продолжать попытки, пока страница не ответит?
Спасибо ... я попробую это .... надеюсь, что это улучшит мою статистику – shantanu
К сожалению, блок catch никогда не вызывался sinc e ошибки, которые я получаю, являются рекомендациями PHP, а не исключениями. Таким образом, второй loadfile никогда не будет выполнен. Теперь я сомневаюсь, что блок catch try будет эффективным. Даже после того, как успех отказа будет установлен в true, и цикл будет завершен для текущего URL ... любые мысли? – shantanu
Вместо того, чтобы пытаться поймать исключение, теперь я проверяю длину строки article_page (String, потому что это то, что возвращает load_file). Если длина равна 0 (в случае ошибки), я повторяю, как было предложено в вашем решении. – shantanu