php - 在 PHP 中处理大型 while 循环的最佳方法

标签 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 行。但是我不知道如何做到这一点。

如有任何帮助,我们将不胜感激!

最佳答案

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

例子:

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

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

关于php - 在 PHP 中处理大型 while 循环的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19568460/

相关文章:

mysql - 如何使用级联?我的不工作

php - 计算指定时间间隔的列总和

php - Symfony:学说进程 d:s:u 但数据库没有变化

javascript - while 循环中 math.random 生成的值

c++ - while(f) 没有按预期表现

php - 复合项目的相似度得分

php - mysql插入处理很多值

php - 调用 mysql_close() 的好处

php - 优化 MYSQL COUNT ORDER BY 查询

c - 赌注必须小于余额才能继续 C