百萬級的數(shù)據(jù)庫表,好像也不用這么麻煩吧?
為武陟等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務,及武陟網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務為網(wǎng)站制作、網(wǎng)站建設(shè)、武陟網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
直接寫一個php,遞歸執(zhí)行就差不多了,但是php.ini中,將memory_limit設(shè)置大一些,再將mysql.connect_timeout值加大些,max_execution_time設(shè)置的值大一些。
如果不想設(shè)置這些,在程序中使用 ini_set() 函數(shù)也是可以的,一開始先遞歸小一些做十幾條,測試通過了再遞歸所有數(shù)據(jù),然后等就行了。
在等待的過程中,你可以用phpmyadmin等工具查看實時進度,如果發(fā)現(xiàn)問題,重啟web服務器進程,就中止運行了,然后再試。
使用for循環(huán)
定義變量$i,配合select * from table where ………… limit $i,100
這樣就可以了
我之前就做過,但因為換了工作,代碼在之前的公司,否則就可以讓你參考下了
另外,我覺得100太少了,最起碼得改成1000才行
php處理數(shù)據(jù)時會有一個等待時間,就是所說的超時時間,而且如果使用mysql的話,它也有一個超時時間,運行一串代碼時間如果超過配置文件的時間,會被中斷不運行。第一種你可以修改php配置文件timeout的運行時間,第二你可以分批處理大量數(shù)據(jù),注意是分批處理,就OK了。
廢話不多說,直接上代碼吧
. 代碼如下:
public function export_data($data = array())
{
# code...
include_once(APP_PATH.'Tools/PHPExcel/Classes/PHPExcel/Writer/IWriter.php') ;
include_once(APP_PATH.'Tools/PHPExcel/Classes/PHPExcel/Writer/Excel5.php') ;
include_once(APP_PATH.'Tools/PHPExcel/Classes/PHPExcel.php') ;
include_once(APP_PATH.'Tools/PHPExcel/Classes/PHPExcel/IOFactory.php') ;
$obj_phpexcel = new PHPExcel();
$obj_phpexcel-getActiveSheet()-setCellValue('a1','Key');
$obj_phpexcel-getActiveSheet()-setCellValue('b1','Value');
if($data){
$i =2;
foreach ($data as $key = $value) {
# code...
$obj_phpexcel-getActiveSheet()-setCellValue('a'.$i,$value);
$i++;
}
}
$obj_Writer = PHPExcel_IOFactory::createWriter($obj_phpexcel,'Excel5');
$filename = "outexcel.xls";
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$obj_Writer-save('php://output');
}
你可以查1W條,然后按每個數(shù)據(jù)100條來分。
$data?=?select?*?from?table?limit?10000
$chunk?=?array_chunk($data,?100);
print_r($chunk);
也可以每次查詢 100 條
$start?=?0;
while($data?=?select?*?from?table?limit?$start,?100)
{
print_r($chunk);
$start?+=?100;
}
異步的方式可以實現(xiàn)~~
如果一定要 php 程序?qū)崿F(xiàn)的話,考慮使用 ob_flush + sleep,但是某些瀏覽器可能會有一些影響,跟你的文檔結(jié)構(gòu)也有關(guān)系,特別是有 table的情況下~
ob_start();
for($i = 0; $i 10; $i++){
echo $i, "br /";
ob_flush();
sleep(10);
}