Ошибка памяти и размера файла при записи 12 000 записей из таблицы mysql в файл csv с помощью функции fputcsv ()

У меня есть база данных из 12 000 записей, которые я хочу записать в CSV-файл, который я пробовал ниже php-кода, но после того, как размер файла становится равным 980 КБ, данные начинают удаляться, а после этого размер файла начинает уменьшаться.
Данные успешно извлечены из таблицы MySQL. Проблема с записью файла CSV.
Пожалуйста, смотрите мой код ниже.

<?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

Решение

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

используйте режим добавления, пишущий «а» (или «ab»)

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

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

1

Другие решения

Проблема была в моей низко-высокой логике, я изменил ее с $ limit, который останется неизменным, и смещением $ на 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();
}
}


?>
0

По вопросам рекламы [email protected]