CSV Import Super Slow после обновления до PHP 7.1 только на работающем сервере - PullRequest
0 голосов
/ 13 декабря 2018

Мы обновили наш рабочий сервер до нового сервера, перешли с использования PHP 5.6 на PHP 7.1 и разместили на нем сайт Drupal 7.По большей части сайт работает нормально.Проблема, которую я вижу после перемещения сервера, заключается в том, что импорт CSV занимает очень много времени по сравнению с предыдущим.Импорт CSV добавляет каждую строку в базу данных.

  $fp = fopen($file_path, 'r');
  if ($fp === FALSE) {
    // Failed to open file.
    watchdog('ea_test', 'Failed to open %file_path', array('%file_path' => $file_path));
    $context['finished'] = TRUE;
    return;
  }
  fseek($fp, $context['sandbox']['offset']);

  for ($i = 0; $i < $limit; $i++) {
    $line = fgetcsv($fp);

    if ($line == FALSE) {
      $done = TRUE;
    }
    // If first line just skipping ahead.
    elseif ($context['sandbox']['records'] < 1) {
      $context['sandbox']['records']++;
    }
    else {
      try {
        db_insert('ea_csv_test')
          ->fields(array(
            'agent_number' => $line[0],
            'total_signatures' => $line[1],
            'template_number' => $line[2],
            'photo' => $line[3] ? 1 : 0,
            'total_views' => $csv_line[4],
            'total_clicks' => $csv_line[5],
            'annual_cost' => $csv_line[7],
            'monthly_cost' => $csv_line[8],
            'popular_button' => $csv_line[9],
            'month' => $csv_line[10],
            'asof' => date('Y-m-d 00:00:00'),
          ))->execute();
      }
      catch (Exception $e) {
        // By setting the databse error it will fail and display the last bad
        // record. Normally I would log/email this but I think it
        // will send too many. More than likely if one is bad they all
        // will be bad.
        $database_insert_error = $e->getMessage();
        $error = TRUE;
      }

      // Set the current position of the file so it starts from there.
      $context['sandbox']['offset'] = ftell($fp);

      $context['sandbox']['records']++;
    }
  }

  $eof = feof($fp);

Дело в локальном, и на моем промежуточном сайте я не могу повторить проблему.Разница лишь в том, что я нахожусь на PHP 7.1.17 на локальном и PHP 7.1.25 на производстве.И local, и prod используют mariadb 5.5.5-10.2.19-MariaDB-log.

Сравнение времени:

Local / Staging занимает 9,51 секунды для обработки.

Производство занимает 276,12 секунды для обработки.

Редактировать

Я запустил импорт напрямую из базы данных (без PHP), и это было очень быстро.Мне кажется, это должна быть какая-то настройка php:

truncate TABLE ea_csv_test;
LOAD DATA INFILE '/tmp/test.csv' into table ea_csv_test
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Edit 2

Заметил, что на Production APCu не был включен.Я включил это, и это немного помогло.С 276 до 166 секунд.

1 Ответ

0 голосов
/ 03 января 2019

Я начал сравнивать настройки innodb, которые я обнаружил, что локально у меня было innodb_flush_log_at_trx_commit, установленное на 2, но в производстве оно было установлено на 1. Как только я изменил его на 2, на производстве это решило мою проблему.

Исходя из того, что я понимаю, что если установлено в 2, он регистрирует каждую секунду вместо любой транзакции.В худшем случае мы можем потерять 1 секунду данных, если сервер выйдет из строя.В моем случае, если мы импортируем, а сервер отключается, мне все равно потребуется перезагрузка, потому что импорт никогда не завершится.Я думаю, что было бы разумно оставить на 1, если мы проводим денежные операции.

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