2011-10-10 2 views
2

MySQL 데이터베이스의 데이터를 사용하여 PHPExcel을 사용하여 Excel 문서를 만듭니다. 내 스크립트는 RAM 512MB의 아래에서 실행해야합니다, 내 수출이 20 만 개 기록에 도달 나는 문제로 실행하고 있습니다 : I 가능한 RAM의 적은 양으로 큰 문서를 만들 수 PHPExcel 사용 방법작은 메모리 풋 프린트로 큰 행을 Excel 문서로 내보내기

PHP Fatal error: Allowed memory size of...

를?

내 현재 코드 :

  // Autoload classes 
    ProjectConfiguration::registerPHPExcel(); 


    $xls = new PHPExcel(); 
    $xls->setActiveSheetIndex(0); 


    $i = 0; 
    $j = 2; 
      // Write the col names 
    foreach ($columnas_excel as $columna) { 
     $xls->getActiveSheet()->setCellValueByColumnAndRow($i,1,$columna); 
     $xls->getActiveSheet()->getColumnDimensionByColumn($i)->setAutoSize(true); 
     $i++; 
    } 


    // paginate the result from database 
    $pager = new sfPropelPager('Antecedentes',50); 
    $pager->setCriteria($query_personas); 
    $pager->init(); 
    $last_page = $pager->getLastPage(); 

    //write the data to excel object 
    for($pagina =1; $pagina <= $last_page; $pagina++) { 
     $pager->setPage($pagina); 
     $pager->init(); 
     foreach ($pager->getResults() as $persona) { 
      $i = 0; 
      foreach ($columnas_excel as $key_col => $columnas) { 
       $xls->getActiveSheet()->setCellValueByColumnAndRow($i,$j,$persona->getByName($key_col, BasePeer::TYPE_PHPNAME)); 
       $i++; 
      } 
      $j++; 
     } 
    } 

    // write the file to the disk 
    $writer = new PHPExcel_Writer_Excel2007($xls); 
    $filename = sfConfig::get('sf_upload_dir') . DIRECTORY_SEPARATOR . "$cache.listado_personas.xlsx"; 
    if (file_exists($filename)) { 
     unlink($filename); 
    } 
    $writer->save($filename); 

CSV 버전 : 추진가 데이터베이스에 요청하는 경우

// Write the col names to the file 
$columnas_key = array_keys($columnas_excel); 
file_put_contents($filename, implode(",", $columnas_excel) . "\n"); 

//write data to the file 
for($pagina =1; $pagina <= $last_page; $pagina++) {      
     $pager->setPage($pagina); 
     $pager->init(); 
     foreach ($pager->getResults() as $persona) { 
      $persona_arr = array(); 
      // make an array   
      foreach ($columnas_excel as $key_col => $columnas) { 
       $persona_arr[] = $persona->getByName($key_col, BasePeer::TYPE_PHPNAME);     
      } 
      // append to the file 
      file_put_contents($filename, implode(",", $persona_arr) . "\n", FILE_APPEND | LOCK_EX);    
     } 
    } 

아직도, RAM의 문제가이 추진 같다 새로운 요청을 할 때마다 RAM을 해제하지 않습니다. 각 반복에서 호출기 객체를 만들고 삭제하려고 시도했습니다.

+0

더 잘 설명 할 수 있습니까? –

+0

CSV를 만드는 대신 파일을 쓸 수 있습니까? – Brad

+0

CSV로 내보내기위한 chages를 만들었으며 비슷한 문제가 있습니다. – rkmax

답변

0

CSV를 사용할 수있는 것으로 보이므로 한 번에 하나의 레코드를 가져 와서 CSV에 추가하십시오. 동시에 200k 개의 레코드를 모두 가져 오려고하지 마십시오.

$cursor = mysql_query($sqlToFetchData); // get a MySql resource for your query 
$fileHandle = fopen('data.csv', 'a');  // use 'a' for Append mode 

while($row = mysql_fetch_row($cursor)){ // pull your data 1 record at a time 
    fputcsv($fileHandle, $row);   // append the record to the CSV file 
} 

fclose($fileHandle);      // clean up 
mysql_close($cursor); 

CSV를 XLS 파일로 변환하는 방법을 잘 모르겠지만 잘하면이 방법을 사용할 수 있습니다.

<?php 
$query = AntecedentesQuery::create() 
      // Some ->filter() 
      ; 
$csv = $query->toCSV(); 

$csv가 you'l 올바른 마임 타입을 설정하여 렌더링 할 수를 CSV 내용을 포함 :

1

추진이 쿼리 API에 formatters을 가지고, 당신은 이러한 종류의 코드를 쓸 수 있습니다 .

+0

감사합니다. – rkmax

관련 문제