2010-05-29 120 views
1

我有一段代码通过给它一个ID来获取数据。例如,如果我给它一个1230的ID,代码将从网站(外部)获取ID为1230的文章数据并将其插入数据库。PHP:无限循环和时间限制!

现在,问题是我需要获取所有文章,可以从ID 00001到99999说。 如果执行'for'循环,60秒后PHP内部时间限制停止循环。 如果使用某种header("Location: code.php?id=00001")header("Location: code.php?id=".$ID)并增加$ ID ++,然后重定向到同一页面,浏览器会阻止我,因为无限循环或重定向问题。

请帮助!

回答

1

如果你的服务器允许你,这可能是最好的解决方案:只要删除这个脚本的时间限制。

set_time_limit(0); 
0

那么你可以通过几种方法来做到这一点。

做到这一点的最佳方法是设置一个cron来每隔X分钟执行一次刮刀。

这是sed你需要跟踪你目前的身份。

所以如果你建立一个函数来写,你可以做以下方式

文件 -

打开文件(获得电流id) 启动分析器在ID为60倍 插入数据 打开文件并使用新ID 关闭文件进行更新并退出。

这将运行在几个小时或无论多长时间的空间。

  • 是,如果你手动这样做的,你坐在那里,令人耳目一新,每次脚本完成,那么你可以使用会话,而不是写ID到文件

    `session_start(); 
    $id = (isset($_SESSION['position']) ? $_SESSION['position'] : 0); 
    for($i=$id;$<=9999;$i++) 
    { 
        //FetchItem($id); //Or whatever function it is you use! 
        //Update the id for next run. 
        $_SESSION['position'] = $id; 
    }` 
    
  • 如果你愿意超越你的服务器资源,你可以使用set_time_limit(120)延长60秒120秒或任何你喜欢的东西。

  • +0

    ... meh。如果他拥有一个非常繁忙的网站,那么通过运行该脚本,或者他计划继续收集这些数据而不是一次性收集这些数据,Cron确实只能走这条路。真的,这个脚本应该只在他的计算机上运行,​​而不是在远程主机上运行。 – Matchu 2010-05-30 00:01:09

    +0

    完全同意,Scraping占用了太多的服务器资源,如果我在刮我会设置一个cron在我的网站最忙的时候运行! – RobertPitt 2010-05-30 00:13:29

    +0

    我在localhost上运行这个脚本,然后通过导入数据库来联机数据库,所以它不是问题。我遇到的问题是我不知道CRON。但我想我会通过设置set_time_limit(0)来做到这一点。 – Jonathan 2010-05-30 00:37:44

    0

    如果您的服务器不会让你改剧本时间限制,只需要你的脚本检查数据库中的序列中的最后插入的文章,并从那里开始。

    另一种方法:使用Javascript“window.location =”而不是标题来重定向。

    +0

    如何检查最后一行然后运行代码而不重定向到同一页面?做一个循环会给时间限制错误。 – Jonathan 2010-05-30 00:03:56

    +0

    对不起,我不是很清楚。我的意思是做循环,让它运行,直到它超时,然后再运行它,并让它从它离开的地方继续。如果这不切合实际(因为它需要太多循环,或者因为这个过程需要完全自动化),那么我提到的JavaScript是更好的方法。 – Robert 2010-05-30 03:48:03