2014-05-22 3 views
0

Я пытаюсь очистить страницы сайта, чтобы получить определенный текстовый контент. Новые страницы всегда добавляются, поэтому я хочу, чтобы иметь возможность просто увеличивать через каждую страницу (с использованием фиксированного URL формата), пока не получите 404.PHP cURL - Почему скрипт умирает после 36-го запроса на удаленный URL?

Страницы в этом формате:

http://thesite.com/page-1.html

http://thesite.com/page-2.html

http://thesite.com/page-3.html

... и т.д ....

Все работает плавно, пока не попадает на 36-ю страницу, затем просто умирает (даже не попадает в тестовый корпус 404). Я знаю, что в этом примере существует около 100 страниц, и я могу вручную просмотреть их все без проблем. Кроме того, на 36-й странице нет ошибки.

Тестовый чехол - я пробовал пройти через http://google.com 50 раз и не имел проблем с рекурсией cURL. Кажется, это веб-сайт, на котором я действительно хочу cURL, или что-то с моим сервером.

Кажется, что это какой-то предел на удаленном сервере или на моем сервере, так как я могу запускать эту страницу снова и снова без задержки, и я всегда читаю 36 страниц, прежде чем они умрут.

Могут ли удаленные серверы устанавливать ограничение на запросы cURL? Есть ли другие таймауты, которые мне нужно увеличить? Это возможная проблема с памятью сервера?

** Рекурсивная Зачистка Функция: ** (Объект $ локона создаются в первом вызове методы, а затем просто передаются по ссылке я прочитал это было лучше, чем создание и закрытия большого количества объектов завитка.)

function scrapeSite(&$curl,$preURL,$postURL,$parameters,$currentPage){ 
     //Format URL 
     $formattedURL = $preURL.$currentPage.$postURL; 
     echo "Formatted URL: ".$formattedURL."<br>"; 
     echo "Count: ".$currentPage."<br>"; 
     //Create CURL Object 
     curl_setopt($curl, CURLOPT_URL, $formattedURL); 

     //Set PHP Timeout 
     set_time_limit(0);// to infinity for example 
     //Check for 404 
     $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
     if($httpCode == 404 || $currentPage == 50) { 
      curl_close($curl); 
      return 'PAGE NOT FOUND<br>'; 
     } 
     //Set other CURL Options 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,0); 
     curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); 
     curl_setopt($curl, CURLOPT_TIMEOUT, 400); //timeout in seconds 
     $content = curl_exec($curl); 
     $html = str_get_html($content); 
     echo "Parameter Check: ".is_array($html->find($parameters))."<br>"; 
     if(is_array($html->find($parameters))>0){ 
      foreach($html->find($parameters) as $element) { 
       echo "Text: ".$element->plaintext."<br>"; 
      } 
      return scrapeSite($curl,$preURL,$postURL,$parameters,$currentPage+1); 
     }else{ 
      echo "No Elements Found"; 
     } 
    } 
+0

блокировка может быть брандмауэр? – CreativeMind

+0

Блокировка брандмауэра не блокирует запросы, если я перезагружаю страницу? Я могу перезагружать страницу назад к спине столько раз, сколько хочу, и скрипт всегда запускается, просто останавливается на 36-й странице. – JimmyJammed

+0

Соединяет ли он 36 раз одновременно? Или 1 на 1? Завершите 1 страницу, затем переходите к следующему? – CreativeMind

ответ

1

может быть, его просто память предельная задача попробовать это (в верхней части скрипта).

ini_set("memory_limit",-1); 

А также вы сказали «... или что-то с моего сервера», так что если вы можете, просто читать журналы ...

+0

Да, это была проблема. Не следует использовать неограниченную память, поэтому я установил ее в 1GB: ini_set ('memory_limit', '1000000000'); – JimmyJammed

+0

хороший, приятный день или утро или ночь или ... –