當表 member中資料量不大時,可以一次性執行:
$q="select * from member'";$r=$obj_db->simplequery($q);while($a=$obj_db->fetchrow($r,DB_FETCHMODE_ASSOC)){ $id=$a[id]; $mccd=$a[cca]+$a[ccb]; $query="insert into mingxi (mid,mccd,mtime) values ('$id','$mccd','$time')"; $obj_db->simplequery($query);}
但當member中資料量達到百萬條時,說會出現執行逾時的錯誤:
Fatal error: Maximum execution time of 30 seconds exceeded in D:
那麼怎麼現實分批處理呢,比如前1000條資料處理結束後,再處理1001至2000條,然後再處理2001至3000條……,直到全部處理完畢?
$q="select * from member'";$r=$obj_db->simplequery($q);while($a=$obj_db->fetchrow($r,DB_FETCHMODE_ASSOC)){$i++;$ep=1000;//這裡假設處理完第1個1000條後再處理第二個1000條,直至處理結束? $id=$a[id]; $mccd=$a[cca]+$a[ccb]; $query="insert into mingxi (mid,mccd,mtime) values ('$id','$mccd','$time')"; $obj_db->simplequery($query);}
請高手幫寫出詳細代碼,謝謝!因程式碼後置在後台執行,所以不要考慮用分頁一頁一頁手工去點的方式
回複討論(解決方案)
可以用 insert into mingxi (mid,mccd,mtime) select id, cca+ccb, time from member
最近處理一些資料 大約56萬條,包括每條的讀取 計算 處理 和插入
使用一個ajax方法去請求PHP頁面,調一個尚未被處理的進行處理,完畢後打上已處理的標記存庫,返回到js, ajax接收到返回以後(可以先輸出到頁面上)調用自身,再次發起請求
56萬條跑了大約10萬秒, 頁面和程式沒死過
雖然很慢,但這跟我的需求(需要把每條資料進行分析處理)有關 而且不會逾時什麼的.
最近處理一些資料 大約56萬條,包括每條的讀取 計算 處理 和插入
使用一個ajax方法去請求PHP頁面,調一個尚未被處理的進行處理,完畢後打上已處理的標記存庫,返回到js, ajax接收到返回以後(可以先輸出到頁面上)調用自身,再次發起請求
56萬條跑了大約10萬秒, 頁面和程式沒死過
雖然很慢,但這跟我的需求(需要把每條資料進行分析處理)有關 而且不會逾時什麼的.
這種方法沒法試用非同步, 處理完畢的傳回值有可能先行返回, 除非是查詢一條然後提交一條的方式. 否則有可能會造成資料丟失.
當然如果1天跑完 你兩天都沒關 應該是沒太大問題.
最近處理一些資料 大約56萬條,包括每條的讀取 計算 處理 和插入
使用一個ajax方法去請求PHP頁面,調一個尚未被處理的進行處理,完畢後打上已處理的標記存庫,返回到js, ajax接收到返回以後(可以先輸出到頁面上)調用自身,再次發起請求
56萬條跑了大約10萬秒, 頁面和程式沒死過
雖然很慢,但這跟我的需求(需要把每條資料進行分析處理)有關 而且不會逾時什麼的.
這種方法沒法試用非同步, 處理完畢的傳回值有可能先行返回, 除非是查詢一條然後提交一條的方式. 否則有可能會造成資料丟失.
當然如果1天跑完 你兩天都沒關 應該是沒太大問題.
為何會先行返回? 沒看明白能否舉個例子說明下
$offs = isset($_GET['offs']) ? $_GET['offs'] : 1;$sql = "select * from member limit $offs, 1000";//做你該做的事header("Location: $_SERVER[PHP_SELF]?offs=" . ($offs+1000));
$offs = isset($_GET['offs']) ? $_GET['offs'] : 1;$sql = "select * from member limit $offs, 1000";//做你該做的事header("Location: $_SERVER[PHP_SELF]?offs=" . ($offs+1000));
放在哪裡呢?你這個是不是等於不斷重新整理頁面啊?頁面中還有一些其它代碼,這個頁面只能執行一次,謝謝
同問 有解決嗎