2012-09-13 36 views
0

現在,我有這樣的事情在我的笨模型:分手大規模的MySQL更新

<?php 
$array = array(...over 29k IDs...); 
$update = array(); 
foreach ($array as $line) { 
    $update[] = array('id' => $line, 'spintax' => $this->SpinTax($string)); 
    ### $this->SpinTax parses the spintax from a string I have. It has to be generated for each row. 
} 
$this->db->update_batch('table', $update, 'id'); 
?> 

第一個20K的記錄得到更新就好了,但我得到一個504 Gateway Time-out完成之前。

我試圖增加nginx服務器超時到荒謬的(如10分鐘),我仍然得到錯誤。

我該怎麼做才能使此不是超時。我已閱讀了許多答案和HOW-TO來分割更新,但我仍然繼續讓服務器超時。 A PHP或CodeIgniter解決方案將非常出色,我需要將此代碼部署到可能不使用nginx(在Apache中出現類似錯誤)的多個服務器。

在此先感謝。

+0

你有多少分段? – wesside

+0

我對每千個值使用'array_chunk',並且沒有更改'foreach'在塊上。 – David

+1

想你需要在不同的部分運行它們,而不是頁面加載。將它們分塊並在同一頁面上一個接一個地運行它們可能會以相同的結果結束。 – wesside

回答

3

您可能需要通過命令行和set_time_limit(0)運行此操作。如果您使用的是codeigniter,請查看如何通過用戶指南運行命令行。 http://codeigniter.com/user_guide/general/cli.html

現在,在你這樣做之前,你提到過你正在使用數組塊。如果您從數據庫獲取所有值,則無需使用array_chunk。例如,設置一個get變量。 /your/url?offset = 1000,當完成後,做一個重定向到相同的東西,但與2000等,直到它完成。

不是最好的或最乾淨的,但可能會完成它。

+0

所以你說,例如,在任何偏移量的基礎上拉1000? – David

+0

無論你從哪裏得到這個($ array = array(... over 29k IDs ...);),設置查詢(如果來自數據庫)限制爲1000,所以如果你只需要減去1000,限制1000,偏移0 ...下一個將偏移1000,限制1000等... – wesside

+0

非常感謝。在'set_time_limit()'函數和CLI位之間,我最終得到它在所有行上執行。 – David