我有一个通过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行。我不知道怎么做到这一点。
任何帮助将不胜感激!
答案 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.