在PHP中处理大量while循环的最佳方法

时间:2013-10-24 14:15:07

标签: php mysql while-loop cron

我有一个通过CRON运行的脚本,它处理我数据库中某个表中的每一行(或用户),然后使用cURL根据行中找到的用户名提取URL,然后添加或更新其他信息进入同一行。这在大多数情况下工作正常,但似乎需要大约20分钟+才能通过整个数据库,它似乎越慢越慢,进入while循环。目前我有大约4000行,将来会有更多行。

现在,我的代码的简化版本是这样的:

$i=0;
while ($i < $rows) {
    $username = mysql_result($query,$i,"username");
    curl_setopt($ch, CURLOPT_URL, 'http://www.test.com/'.$username.'.php');
    $page = curl_exec($ch);
    preg_match_all('htmlcode',$page,$test)
    foreach ($test as $test3) {
         $test2 = $test[$test3][0];
    }
mysql_query("UPDATE user SET info = '$test2' WHERE username = '$username');
    ++$i;
}

我知道MySQL查询不应该在while循环中,它是我从中删除的最后一个查询,但是处理需要运行的while循环的最佳方法是什么过了很长时间?

我认为最好的选择是让脚本一次运行十行,然后停止。例如,因为我在CRON中有脚本,所以我希望它每5分钟运行一次,它将运行10行,停止,然后以某种方式知道在CRON作业再次启动时接收下10行。我不知道怎么做到这一点。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

关于逐步加载数据:
您可以在表中添加“last_updated”列,并在每次加载页面时更新它。然后在再次加载网站之前将该列与当前时间戳进行比较。

示例:

mysql_query("UPDATE user SET info = '$test2', last_updated = ".time()." WHERE username = '$username');

当您加载数据时,请将其设为“WHERE last_updated&gt;(time() - $ time_since_last_update)”

答案 1 :(得分:0)

放弃'foreach'循环怎么样? 只需使用$test数组的最后一个元素。

答案 2 :(得分:0)

LIMIT和OFFSET是你的朋友。按照Bastian的建议,通过数据库字段跟踪您的位置,或者您甚至可以存储您在某处使用的最后一个偏移量(可能是平面文件),然后在每次运行脚本时增加该值。当您不再获取任何数据时,请将其重置为0.