#php #laravel #heroku #upload #php-ini
#php #laravel #heroku #загрузка #php-ini
Вопрос:
Я не понимаю, как я могу отправить ответ, чтобы избежать ошибки сервера Heroku при загрузке файлов размером более 20 МБ.
Я использую PHP 7.4 / Laravel 8.x и получаю,
heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST
H18 означает, что сокет подключен, некоторые данные были отправлены приложением как часть ответа, но затем сокет был уничтожен без завершения ответа.
Он завершается досрочно из-за 30-секундного ограничения запроса Heroku.
Я настроил свой файл .user.ini,
post_max_size = 100M
upload_max_filesize = 100M
max_input_time = 300
max_execution_time = 300
Я объявляю это в Procfile,
web: vendor/bin/heroku-php-apache2 -i .user.ini public/
Я принимаю несколько файлов в своей форме,
<input style="display:none;" type="file" id="files" name="attachment[]" multiple required>
<label for="files" class="files-button" id="filesButton">Upload Images</label>
если файл представляет собой изображение, я загружаю его
ini_set('memory_limit', '-1'); // more memory
if($request->hasFile('attachment')) {
$valid_exts = ['png', 'jpg', 'jpeg'];
foreach ($files as $file) {
$extension = $file->getClientOriginalExtension();
if (in_array($extension, $valid_exts)) {
Storage::disk('s3')->put("/model images/$url_name/", $file);
}
}
}
}
Есть ли какой-либо способ обойти этот 30-секундный принудительный тайм-аут?
Ответ №1:
Я сталкиваюсь с той же проблемой. Как вы говорите, соединение прерывается разделом большого ответа.
Обычно H18 указывает, что ответ состоит из нескольких этапов — например, потоковые фрагменты большого ответа — и что один из этих этапов выдал ошибку. https://devcenter.heroku.com/articles/error-codes#h18-server-request-interrupted
Документы предлагают просмотреть файлы журналов, чтобы определить, на каком этапе / фрагменте ответа он вызвал ошибку, и устранить эту проблему.
Что касается настройки тайм-аута, Heroku говорит, что это невозможно.
Значение тайм-аута не настраивается. Если вашему серверу требуется больше 30 секунд для выполнения данного запроса, мы рекомендуем перенести эту работу на фоновую задачу или работника, чтобы периодически проверять ваш сервер, чтобы узнать, завершена ли обработка запроса. Этот шаблон освобождает ваши веб-процессы для выполнения большего объема работы и сокращает общее время отклика приложения. https://devcenter.heroku.com/articles/request-timeout#long-polling-and-streaming-responses
И предложите использовать «прямую» загрузку файла, загрузив его непосредственно на S3 из браузера. https://devcenter.heroku.com/articles/s3#file-uploads
Комментарии:
1. В итоге мне не пришлось это реализовывать. Но да, ответ заключается в прямой загрузке файлов и правильной настройке CORS и других разрешений в S3.