【问题标题】:PHP cURL - Why does script die after 36th request to a remote URL?PHP cURL - 为什么脚本在第 36 次请求远程 URL 后死亡?
【发布时间】:2014-05-22 16:51:10
【问题描述】:

我正在尝试抓取网站的页面以获取某些文本内容。 新页面总是被添加,所以我希望能够增加每个页面(使用固定格式的 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";
        }
    }

【问题讨论】:

  • 可能是防火墙阻止了?
  • 如果我重新加载页面,防火墙阻止不会阻止请求吗?我可以根据需要多次重新加载页面,并且脚本始终运行,仅在第 36 页停止。
  • 是否同时连接 36 次?还是 1 比 1?完成 1 页然后继续下一页?
  • @CreativeMind 一页又一页。循环当前页面查找指定元素,完成后调用递归函数进入下一页。

标签: php curl timeout remote-server limits


【解决方案1】:

也许它只是内存限制问题试试这个(在脚本的顶部)。

ini_set("memory_limit",-1);

你还说“......或者我的服务器的东西”,所以如果可以,请阅读你的日志......

【讨论】:

  • 是的,这就是问题所在。不过不应该使用无限内存,所以我将其设置为 1GB:ini_set('memory_limit', '1000000000');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多