У меня есть веб-сайт с фотографиями, над которым я работаю в Ларавеле. Я использую пакет под названием Intervention / Image. В административной области сайтов есть место, где администраторы могут создавать проекты, а затем загружать любое количество изображений в этот проект. Проблема заключается в том, что если размер изображения составляет 4 МБ или больше, и одновременно загружается 10 или более файлов, я получаю эту ошибку:
Maximum execution time of 30 seconds exceeded
Я чувствую, что скрипт или библиотека используют много памяти, но я не уверен, что не так. Я знаю, что могу увеличить память и ограничение по времени, но я не чувствую, что мне это нужно.
Я также пробовал меньшие изображения размером 100 КБ или меньше, любое количество изображений свыше 20 убивает процесс и завершает только первые 20 изображений. Я проверил сервер, и изображения правильно загружаются в правильное местоположение, но они не записываются в базу данных.
Я не уверен, что является причиной проблемы загрузки или запросов. Ниже находится контроллер, который загружает изображения. В качестве дополнительного примечания сценарий также создает файлы четырех размеров для каждого изображения.
<?php
class UploadController extends BaseController {
private $sizes = array( 'large' => 2000, 'medium' => 1500, 'small' => 1000, 'thumb' => 300 );
public function upload( $id ) {
$movedArray = array();
$errors = 0;
$images = Input::file('images');
foreach( $images as $img ) {
$oName = $img->getClientOriginalName();
$oMimeType = $img->getMimeType();
$oSize = $img->getSize();
$oExt = $img->getClientOriginalExtension();
$oTemp = $img->getRealPath();
// get original file name
$name = str_replace( array(' '), array('-'), $oName );
$orig = $oTemp;
$image_original = Image::make( $img );
foreach( $this -> sizes as $sizename => $size ) {
$movedPath = public_path() .'/projects/';
$movedName = strtotime('now') .'-'. $id .'-'. $sizename .'-'. $name;
$moved = $image_original -> resize( $size, null, function( $constraint ) {
$constraint -> aspectRatio();
});
$resizedMoved = $moved -> save( $movedPath . $movedName );
$movedArray[$sizename] = $movedName;
}
// create the record in the database
$upload = new Upload;
$upload -> user_id = Auth::id();
$upload -> project_id = $id;
$upload -> thumbnail = $movedArray['thumb'];
$upload -> small = $movedArray['small'];
$upload -> medium = $movedArray['medium'];
$upload -> large = $movedArray['large'];
$upload -> file_type = $oMimeType;
$upload -> file_size = $oSize;
$upload -> file_extension = $oExt;
$upload -> save();
}
if( $errors > 0 ) {
Session::put('alert-class', 'success');
Session::put('msg', 'All files have been uploaded');
} else {
Session::put('alert-class', 'danger');
Session::put('msg', 'Uh oh, something went wrong please try again');
}
return Redirect::back();
}
}
Является ли мой единственный вариант увеличить память и ограничение по времени? Если так, я чувствую, что это плохое программирование, потому что я уже установил это:
ini_set("memory_limit","1000M");
set_time_limit(1000);
И я все еще получаю ту же ошибку, любая помощь будет принята с благодарностью!
Спасибо
Ошибка, связанная с тем, что вы не имеете ничего общего с ограничением памяти, но с ограничением по времени и с этой проблемой из-за множества манипуляций с изображениями, а также из-за самостоятельной загрузки занимает некоторое время
Пожалуйста, укажите, где вы установили часть set_time_limit (1000).
Также вы могли бы улучшить производительность, вместо того, чтобы запрос вставки для каждого изображения сохранял данные в массиве, и после завершения всех загрузок поместите их все вместе в один запрос вставки.
+ Изменить
max_file_uploads
в твоем php.ini 🙂