PHP cURL - Почему скрипт умирает после 36-го запроса к удаленному URL-адресу?

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

Страницы имеют следующий формат:

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? Есть ли другие тайм-ауты, которые мне нужно увеличить? Возможна ли проблема с памятью сервера?

**Функция рекурсивного извлечения: ** (Объект $curl создается при первом вызове метода, а затем просто передается по ссылке. Я читал, что это лучше, чем создавать и закрывать большое количество объектов 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";
        }
    }

person JimmyJammed    schedule 22.05.2014    source источник
comment
может брандмауэр блокирует?   -  person Nikita 웃    schedule 22.05.2014
comment
Будет ли блокировка брандмауэра не блокировать запросы, если я перезагружу страницу? Я могу перезагружать страницу столько раз, сколько захочу, и скрипт всегда работает, просто останавливается на 36-й странице.   -  person JimmyJammed    schedule 22.05.2014
comment
Он подключается 36 раз одновременно? Или 1 на 1? Закончить 1 страницу и перейти к следующей?   -  person Nikita 웃    schedule 22.05.2014
comment
@CreativeMind 1 страница за другой. Перебирает текущую страницу, чтобы найти указанные элементы, а затем, закончив, вызывает рекурсивную функцию для перехода к следующей странице.   -  person JimmyJammed    schedule 23.05.2014


Ответы (1)


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

ini_set("memory_limit",-1);

А еще вы сказали "... или что-то с моим сервером", так что, если можете, просто прочитайте свои логи...

person Engin Zeybekoğlu    schedule 22.05.2014
comment
Да, это была проблема. Однако не следует использовать неограниченную память, поэтому я установил ее на 1 ГБ: ini_set('memory_limit', '1000000000'); - person JimmyJammed; 23.05.2014