2014-09-02 150 views
0

我正在运行MySQL的PHP​​Excel输出。MySQL PHPExcel查询执行时间太长

当我使用几行输出运行代码并输出到Excel时,所有事情都很好,当我运行下面的代码时,根据zend服务器日志,执行时间非常漫长。

我没有得到任何输出,我得到一个请求,在似乎是永恒之后打开一个PHP文件!

任何协助赞赏。

这里是到目前为止的代码:

$queryGetIMEI = "SELECT DISTINCT(wi_iridium_og_device) FROM wi_iridium_og ORDER BY wi_iridium_og_device DESC"; 
//declare the new array for the IMEI numbers 
$IMEI = array(); 

if ($result = $mysqli->query($queryGetIMEI)) { 

    /* fetch associative array */ 
    while ($row = $result->fetch_array()) { 
     $IMEI[] = $row["wi_iridium_og_device"]; 
    } 
    /* free result set */ 
    $result->free(); 
} 

// call the PHPexcel Files 
require_once 'classes/PHPExcel.php'; 
require_once 'classes/PHPExcel/IOFactory.php'; 


$objPHPExcel = new PHPExcel(); 

$sheet_count = 0; 


foreach ($IMEI as $c) { 
    if ($sheet_count > 0) { 

     // This creates the next sheet in the sequence 
     // One sheet per IMEI in this example 
     $objPHPExcel->createSheet(); 
     $objPHPExcel->setActiveSheetIndex($sheet_count); 
    } 

    // Add tab label to the sheet 
    $objPHPExcel->getActiveSheet()->setTitle(substr($c,0,30)); 

    // Column headings in the first row 
    $objPHPExcel->getActiveSheet()->setCellValue('A1','Device'); 
    $objPHPExcel->getActiveSheet()->setCellValue('B1','Site Reference'); 
    $objPHPExcel->getActiveSheet()->setCellValue('C1','Charge Type'); 
    $objPHPExcel->getActiveSheet()->setCellValue('D1','Date'); 
    $objPHPExcel->getActiveSheet()->setCellValue('E1','Time'); 
    $objPHPExcel->getActiveSheet()->setCellValue('F1','Number Called'); 
    $objPHPExcel->getActiveSheet()->setCellValue('G1','Service'); 
    $objPHPExcel->getActiveSheet()->setCellValue('H1','Call Termination'); 
    $objPHPExcel->getActiveSheet()->setCellValue('I1','MSISDN'); 
    $objPHPExcel->getActiveSheet()->setCellValue('J1','Originating Country'); 
    $objPHPExcel->getActiveSheet()->setCellValue('K1','UNUSED_3'); 
    $objPHPExcel->getActiveSheet()->setCellValue('L1','UNUSED_4'); 
    $objPHPExcel->getActiveSheet()->setCellValue('M1','UNUSED_5'); 
    $objPHPExcel->getActiveSheet()->setCellValue('N1','UNUSED_6'); 
    $objPHPExcel->getActiveSheet()->setCellValue('O1','UNUSED_7'); 
    $objPHPExcel->getActiveSheet()->setCellValue('P1','UNUSED_8'); 
    $objPHPExcel->getActiveSheet()->setCellValue('Q1','Units'); 
    $objPHPExcel->getActiveSheet()->setCellValue('R1','Currency'); 
    $objPHPExcel->getActiveSheet()->setCellValue('S1','Charge'); 

    // Dynamic data comes next 
    // Query the DB based on the IMEI value. Pass the result to the while loop 

    $query_GetBillPerIMEI = "SELECT SQL_NO_CACHE wi_iridium_og_device, wi_iridium_og_charge_type, wi_iridium_og_date, wi_iridium_og_time, wi_iridium_og_number_called, wi_iridium_og_service FROM wi_iridium_og WHERE wi_iridium_og_device = ". $c ." AND wi_iridium_og.wi_iridium_og_charge_type != 'SBD Overage' ORDER BY wi_iridium_og_charge_type ASC"; 
    $result = $mysqli->query($query_GetBillPerIMEI);  
    $rowcount = 2; 
    while ($row = $result->fetch_array()){ 

     $objPHPExcel->getActiveSheet()->SetCellValue('A' .$rowcount, $row['wi_iridium_og_device']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('B' .$rowcount, $row['wi_iridium_og_site_reference']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('C' .$rowcount, $row['wi_iridium_og_charge_type']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('D' .$rowcount, $row['wi_iridium_og_date']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('E' .$rowcount, $row['wi_iridium_og_time']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('F' .$rowcount, $row['wi_iridium_og_number_called']); 
     $objPHPExcel->getActiveSheet()->SetCellValue('G' .$rowcount, $row['wi_iridium_og_service']); 

当我下面的行添加到输出:

$objPHPExcel->getActiveSheet()->SetCellValue('G' .$rowcount, $row['wi_iridium_og_service']); 

的文件,然后运行失败,并产生输出。

我在数据库中有超过30,000个条目需要查询。

帮助!!!

+1

它不会帮助你嵌套你的查询:你不能使用一个连接,所以你只做一个单一的查询? – 2014-09-02 12:31:56

+0

使用fromArray()等技术来填充PHPExcel数据而不是填充每个单独的单元格,或者至少使用流畅的界面,因此您不会为每个单元格调用getActiveSheet() – 2014-09-02 12:32:44

+0

而且您正在浪费内存等资源:你迭代一个数据库游标'$ result'并加载内存中的每条记录。为什么在您访问数据的同时您没有处理数据? – PauloASilva 2014-09-02 12:38:35

回答

0

首先了解PHP PDOPrepared Statements:这将是足以应付/避免SQL注入(上查询的问题在这里WHERE wi_iridium_og_device = ". $c ." AND,因为你不知道这可能是有害的$c值)。

关于如何返工,以提高你的源代码的性能......(这不会是功能性的,它读成伪代码)

<?php 
// call the PHPexcel Files 
require_once 'classes/PHPExcel.php'; 
require_once 'classes/PHPExcel/IOFactory.php'; 

$objPHPExcel = new PHPExcel(); 
$sheet_count = 0; 

$queryGetIMEI = "SELECT DISTINCT(wi_iridium_og_device) FROM wi_iridium_og ORDER BY wi_iridium_og_device DESC"; 

//declare the new array for the IMEI numbers 

if ($result = $mysqli->query($queryGetIMEI)) 
{ 
    /* fetch associative array */ 
    while ($row = $result->fetch_array()) 
    { 
     // your foreach login in here (without the foreach) 
    } 
} 

这应该提高你的内存占用,但可能你”也可以改善你的查询。