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