У меня есть эта функция на моем контроллере (я использую CodeIgniter), который читает базу данных, а затем создает строку с разделителями-запятыми, которую я передаю в print (), чтобы пользователь мог сохранить / открыть файл.
При разработке экспорт около 2000+ записей занимает около 20-30 секунд. Проблема в том, что на производстве запрос не завершается / переходит на пустую страницу (в браузере не отображается диалоговое окно сохранения / открытия).
Нужно ли настраивать некоторые другие настройки php.ini? В настоящее время на производстве memory_limit составляет 256 МБ, max_execution_time на 300. (На разработке max_execution_time на 600).
Если это поможет, вот коды (урезанные версии):
Модель (kidsprofile_model):
function get_masterlist() {
$this->db->select(kid_id,name, date_created, date_modified, birthdate)
->from('kids_profile');
}
Функция контроллера, которая обрабатывает вышеперечисленное в CSV:
function export_to_csv() {
$kids = $kid_model->get_master_list();
$out = "";
$out .= "Date Created,Date Modified,Kid Id,Kid Name,Age".
"Father Name,Mother Name,Guardian 1 Name,Guardian 2 Name,\n";
foreach ($kids->result() as $kid) {
$date_created = ($kid->date_created)?date('F j Y',$kid->kid_date_created):'';
$date_modified = ($kid->date_modified)?date('F j Y',$kid->date_modified):'';
$out .= $date_created.",".$date_modified.",".$kid->kid_name.",".getAge($kid->birthdate).","
.get_detail_of_parent($kid->kid_id,'Mother','lname').",".get_detail_of_parent($kid->kid_id,'Mother','fname').",".get_detail_of_parent($kid->kid_id,'Mother','contact_no').","
.get_detail_of_parent($kid->kid_id,'Father','lname').",".get_detail_of_parent($kid->kid_id,'Father','fname').",".get_detail_of_parent($kid->kid_id,'Father','contact_no').","
.get_detail_of_guardian($kid->kid_id,0,'fname').",".get_detail_of_guardian($kid->kid_id,0,'lname').",".get_detail_of_guardian($kid->kid_id,0,'contact_no').","
.get_detail_of_guardian($kid->kid_id,1,'fname').",".get_detail_of_guardian($kid->kid_id,1,'lname').",".get_detail_of_guardian($kid->kid_id,1,'contact_no').",";
$out .="\n";
}
header("Content-type: text/x-csv");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Disposition: attachment; filename=master_list.csv");
header("Pragma: no-cache");
header("Content-Length: " . strlen($out));
header("Expires: 0");
print($out);
}
get_detail_of_guardian (), который вы видите выше в цикле for, запрашивает другую таблицу, которая получает информацию об опекуне для ребенка. (Для тех, кто может сказать, почему бы просто не уйти, присоединитесь к нему вместе с запросом для детей выше, я попробовал это, и это намного медленнее, поскольку мне нужно 4 левых соединения (2 родителя, 2 опекуна) для 1 ребенка.)