Выполнение функции написания результатов в CSV MySQL не заканчивается на производстве - PullRequest
0 голосов
/ 13 октября 2009

У меня есть эта функция на моем контроллере (я использую 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 ребенка.)

Ответы [ 2 ]

0 голосов
/ 13 октября 2009

Огромное количество вызовов, которые вы делаете для get_detail_of_parent и get_detail_of_guardian, заставляет меня поверить, что вам не хватает памяти. 4 СЛЕДУЮЩИЕ СОЕДИНЕНИЯ не должны резко снижать скорость вашего запроса, если у вас нет правильной индексации таблиц или вы работаете с очень большими наборами данных и не хватает свободной памяти.

Не могли бы вы сконденсировать ваши вызовы для получения fname, lname и contact_no в одном запросе? Похоже, что вы, возможно, запрашиваете базу данных для каждого из них, что приводит к 12 запросам для каждого результата, который вы повторяете.

0 голосов
/ 13 октября 2009

Можете ли вы изменить запрос, чтобы он получал меньше данных или обрабатывал меньше? Если это работает, то вы знаете, что это тайм-аут или проблема с памятью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...