drupal — CSV Import Super Slow после обновления до PHP 7.1 только на живом сервере

Мы обновили наш производственный сервер до нового сервера и перешли с использования 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.

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

Локальная / промежуточная обработка занимает 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;

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

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

0

Решение

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

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

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector