Проблема кратко - Out of memory во время загрузки изображений при относительно "медленном" соединении. На стороне клиента загружается не более 3х изображений одновременно. В приложении картинка конвертится и запись о ней отправляется в таблицу где сейчас порядка 200k записей (размер таблицы 12Mb).
Подбробней.
Out of memory вылетает при очереди загрузки 50+ изображений, где-то под конец очереди на клиенте - на 40м-50м изображнеии. И следом за нехваткой памяти ложится Mysql. Судя по всему, проблема только у меня из-за "медленного" соединения через океан, так как локальные пользователи ни разу не жаловались и сервер не ложился - ошибка вылетает только у меня на некоторых подключениях.
В логах:
Symfony\Component\Debug\Exception\FatalErrorException
Out of memory (allocated 25165824) (tried to allocate 8192 bytes)
vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php at line 136
$canvas = imagecreatetruecolor($width, $height);
после чего ложится мускул с писком - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
На стороне клиента загруза идет через Dropzone
parallelUploads: "3",
maxFilesize: "5",
На backend-де обработка в Intervention\Image
// уже и не помню где не хватало... м.б. на старом сервере или еще раньше
ini_set('memory_limit','256M');
$uploadedImage = Image::make($image);
$uploadSuccess = $uploadedImage->resize(1024, null, function ($constraint) {
$constraint->aspectRatio();
})->save( public_path( $img_path ), 85 );
if( $uploadSuccess ) {
$image = new \App\Image;
$image->image = $filename;
$image->width = $uploadSuccess->width();
$image->height = $uploadSuccess->height();
$image->position = $position;
$dbInsert = $image->save();
//Free up memory? Есть ли смысл?
// $uploadedImage->destroy();
if($dbInsert){
return Response::json(['success'], 200);
}else{
return Response::json('error', 400);
}
} else {
return Response::json('error', 400);
}
Настройки php.ini
memory_limit 128M
upload_max_filesize 2M
max_file_uploads 20
max_execution_time 30
не знаю - нужно ли - нагрузка при стабильной работе
при загрузке и тестах сделаю ночью и добавлю
Из того что нагуглил сам - загрузку с очисткой памяти - буду тестировать ночью.
Вопросы обычные - куда копать, чего читать? Есть ли вариант слегка отделаться малой кровью слегка урезав выделенную память на Mysql и добавить на Php? Если да - то как правильно ее рассчиать?
UPD:
данный параметр оказался legacy с godaddy и его отключение как минимум не ухудшило работу
ini_set('memory_limit','256M');
при отключенном/закоментированном этом параметре
при низкой посещаемости (ночью) постановке в очередь загрузки 86и 400kb изображений
дала следующую нагрузку
и приложение не зависло