2

我有一个通过 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 行。但是,我不知道如何做到这一点。

任何帮助,将不胜感激!

4

3 回答 3

1

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

例子:

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

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

于 2013-10-24T14:31:25.347 回答
0

LIMIT 和 OFFSET 是你的朋友。按照 Bastian 的建议,通过 DB 字段跟踪您的位置,或者您甚至可以存储您在某处使用的最后一个偏移量(可能是一个平面文件),然后在每次运行脚本时增加它。当您没有更多数据返回时,将其重置为 0。

于 2013-10-24T14:48:13.280 回答
0

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

于 2013-10-24T14:23:43.773 回答