2015-05-18 7 views
0

У меня есть база данных из 12 000 записей, которые я хочу записать в файл csv. Я пробовал под PHP-кодом, но после того, как размер файла становится 980kb данные начинают удалять, и размер файла начинает уменьшаться после этого. Данные успешно извлекаются из таблицы mysql. Проблема с записью файла csv. См. Мой код ниже.Проблема с памятью и размером файла с записью 12 000 записей из таблицы mysql в файл csv с использованием функции fputcsv()

<?php 
include './connection.php'; 

set_time_limit(0); 
ini_set('memory_limit', '1024M'); 
$connection; 
$db_link; 

    $output_file = "db_data.csv"; 

    try { 

     $csv_file = fopen($output_file,"b"); 
     $value = array('Name','Address','Phone Number','International Phone Number','Website'); 
      if(!empty($value)){ 
       fpassthru($csv_file); 
       fputcsv($csv_file, $value,','); 
       fclose($csv_file); 
      }  
    } catch (Exception $e) { 
     echo $message = $e->getMessage(); 
    } 



     $connection = new Connection('1.2.3.8','admin','pass','automtn'); 
     $db_link = $connection->connect(); 
     $low = 0; 
     $high = 100; 
     $query = "SELECT name,formatted_address,formatted_phone_number,international_phone_number,website " 
       . " FROM `fetch_data` ORDER BY id ASC LIMIT $low OFFSET $high"; 

     while($result = mysqli_query($db_link,$query)){ 
      $data = array(); 
      while ($row = mysqli_fetch_row($result)) {     
       $data[] = $row;     
      } 
      write_to_csv($data); 
      unset($data); 
      $low+=100; 
      $high+=100; 
      $query = "SELECT name,formatted_address,formatted_phone_number,international_phone_number,website " 
       . " FROM `fetch_data` ORDER BY id ASC LIMIT $low OFFSET $high"; 

     } 

function write_to_csv($results) { 

    global $output_file; 
    $row = 0; 
    try { 

     $csv_file = fopen($output_file,"b"); 

     $fetched_data = $results; 
     unset($results); 
     foreach ($fetched_data as $value) { 
      if(!empty($value)){ 
       fpassthru($csv_file); 
       fputcsv($csv_file, $value, ','); 
      }    
     } 
     fclose($csv_file); 
     unset($fetched_data); 
    } catch (Exception $e) { 
     echo $message = $e->getMessage(); 
    } 
} 


?> 
+0

Может быть, вы открывать/закрывать слишком быстро файл. После данных 1Mo для открытия и закрытия файла требуется больше времени. Попробуйте увеличить низкий/высокий зазор. Или возможно добавить сон после fclose и/или fopen? Вы также можете попытаться поднять memory_limit (даже если он выглядит достаточно ...) – Random

ответ

1

Вы пишете в начале файла каждый раз. откровенно я удивлен, режим «б» сам по себе не бросает ошибку; если документация не устарела.

использование Append режим письма «а» (или «б»)

$csv_file = fopen($output_file,"ab"); 

Поскольку вы оставляете глобальное имя файла, то почему бы не сэкономить некоторые проблемы и сохранить глобальный дескриптор файла вместо этого. вам не придется тратить время на открытие и закрытие файла каждый раз, когда вы пишете.

+0

Да, я уже изменил его на +. thnx :) –

0

Проблема была с моей низкой высокой логики, я изменил его с $ предел, который будет оставаться постоянным и $ приращение смещения на 100 каждый раз, теперь работает нормально

<?php 
include './connection.php'; 

set_time_limit(0); 
ini_set('memory_limit', '1024M'); 
$connection; 
$db_link; 

    $output_file = "db_data.csv"; 

    try { 

     $csv_file = fopen($output_file,"a+"); 
     $value = array('Name','Address','Phone Number','International Phone Number','Website'); 
      if(!empty($value)){ 
       fpassthru($csv_file); 
       fputcsv($csv_file, $value,','); 
       fclose($csv_file); 
      }  
    } catch (Exception $e) { 
     echo $message = $e->getMessage(); 
    } 



     $connection = new Connection('1.2.3.8','admin','pass','automtn'); 
     $db_link = $connection->connect(); 
     $limit = 100; 
     $offset = 0; 

     $query = "SELECT name,formatted_address,formatted_phone_number,international_phone_number,website " 
       . " FROM `fetch_data` ORDER BY id ASC LIMIT $limit OFFSET $offset "; 

     while($result = mysqli_query($db_link,$query)){ 
      $data = array(); 
      while ($row = mysqli_fetch_row($result)) {     
       $data[] = $row;     
      } 
      write_to_csv($data); 
      unset($data); 

      $offset +=100; 
      $query = "SELECT name,formatted_address,formatted_phone_number,international_phone_number,website " 
       . " FROM `fetch_data` ORDER BY id ASC LIMIT $low OFFSET $offset "; 

     } 

function write_to_csv($results) { 

    global $output_file; 
    $row = 0; 
    try { 

     $csv_file = fopen($output_file,"a+"); 

     $fetched_data = $results; 
     unset($results); 
     foreach ($fetched_data as $value) { 
      if(!empty($value)){ 
       fpassthru($csv_file); 
       fputcsv($csv_file, $value, ','); 
      }    
     } 
     fclose($csv_file); 
     unset($fetched_data); 
    } catch (Exception $e) { 
     echo $message = $e->getMessage(); 
    } 
} 


?>