2013-10-24 110 views
1

我有一個通過cron運行一個腳本,在我的數據庫中的表的一個處理每行(或用戶),然後使用捲曲根據找到的用戶名拉網址在行中,然後將附加信息添加或更新到同一行中。這在大部分情況下工作正常,但似乎需要大約20分鐘才能完成整個數據庫,並且它似乎越慢越慢進入while循環。我現在有大約4000行,未來會有更多。的最佳方式來處理大量while循環在PHP

現在我的代碼的簡化版本是這樣的:

$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 querys不應該在一個while循環,這是最後一次查詢我從它刪除,但什麼是處理需要長時間反覆運行的while循環的最佳方式?

我想最好的辦法是必須通過一次行10運行,那麼停止腳本。例如,因爲我在CRON中有腳本,所以我希望每5分鐘運行一次腳本,它將運行10行,停止,然後以某種方式知道CRON作業再次啓動時接下來的10行。然而,我不知道如何完成這個。

任何幫助,將不勝感激!

回答

1

關於逐步加載數據:
您可以向表中添加一列「last_updated」,並在每次加載頁面時更新它。然後,在再次加載網站之前,將該列與當前時間戳進行比較。

例子:

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

當你加載數據,使其 「WHERE LAST_UPDATED>(時間() - $ time_since_last_update)」

+0

謝謝,這工作得很好。 =) – user1342220

0

大約下降了 '的foreach' 循環是什麼? 只需使用$test陣列的最後一個元素。

0

LIMIT和OFFSET在這裏你的朋友。按照Bastian的建議跟蹤數據庫字段的位置,或者甚至可以存儲您在某處使用的最後一個偏移量(可以是平面文件),然後在每次運行腳本時增加該偏移量。當你沒有得到更多的數據,將其重置爲0.