Using below code you can able to download or create CSV/XLS file with huge data (I have used it for around 90,000 records) using batch process.
// Menu callback.
// Collect table row values
Some useful references:
-- Drupal 7 Batch Process Example
// Menu callback.
$items['url_to_my_batch'] = array( 'title' => "Batch process to download some huge contents", 'page callback' => 'my_batch_callback', 'access arguments' => 'administer users', 'type' => MENU_CALLBACK, );Batch menu call back definition.
function my_batch_callback() {
// File create.
$download_folder = 'public://my_folder';
$file_name = 'my-file-' . date('m-d-Y') . '.csv';
$header = array('Name', 'age', .....);
// Append header values.
if (!file_exists($download_folder)) {
mkdir($download_folder, 0777, TRUE);
}
$fp = fopen($download_folder . '/' . $file_name, 'w');
fprintf($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
fwrite($fp, implode(",", $header) . "\n");
fclose($fp);
// Batch process starts.
$total = count_for_batch(); // Get total count. It was 90,000 records in my case.
$batch = array(
'title' => t('Batch process to download huge data'),
'finished' => 'process_finished_batch',
);
$i = 0;
$total = $total +1000;
while($i <= $total) {
$batch['operations'][] = array('process_my_batch', array($i, $total));
$i += 1000 ;
}
batch_set($batch);
batch_process('success/page');
}
I have split 90,000 records into 1000 records each to single batch process.
// Collect table row values
function process_my_batch($from, $total, &$context) {
$download_folder = 'public://my_folder';
$file_name = 'my-file-' . date('m-d-Y') . '.csv';
$results = function_to_collect_rows($from, 1000);
if (!isset($context['sandbox']['progress'])) {
$context['sandbox']['progress'] = 0;
$context['sandbox']['max'] = count($results[0]);
}
$fwp = fopen($download_folder . '/' . $file_name, 'a');
if (!empty($results[0])) {
foreach ($results[0] as $key => $value) {
if (!empty($value)) {
fwrite($fwp, implode(",", $value) . "\n");
}
//increment our progress
$context['sandbox']['progress']++;
}
}
fclose($fwp);
//check if batch is finished and update progress
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
// Batch finish.
function process_finished_batch($success, $results, $operations) {
if($success) {
$message = t('The batch was successful');
drupal_set_message($message);
}
else {
drupal_set_message(t('An error occurred and processing did not complete.'), 'error');
}
}
Some useful references:
-- Drupal 7 Batch Process Example
No comments:
Post a Comment