#php #nginx #file-upload #large-files
#php #nginx #загрузка файла #большие файлы
Вопрос:
Я понимаю, что по этому поводу уже есть масса вопросов, но я следил за всеми из них и не могу найти никакой информации о том, как дальше отлаживать это не работает.
Я могу загрузить файл размером 490 МБ абсолютно нормально. Я не могу загрузить файл размером 562,8 МБ.
Я использую php 7.0.11 с fpm, nginx 1.11.3, ubuntu 16 и использую Laravel 5.1
Мои настройки php ini:
upload_max_filesize 1 ГБ
post_max_size 1 ГБ
memory_limit 1 ГБ (на самом деле это не нужно, но я все равно пробовал)
Мои настройки nginx:
client_max_body_size 1G
Я не нашел никаких ссылок на какие-либо другие переменные, которые необходимо изменить или которые могут помешать.
Когда я загружаю $_FILES
, выглядит так:
["file"]=>
array(5) {
["name"]=> string(36) "CSBgGvDIAaZtbC4lmliLevHf0bAnWiKM.rar"
["type"]=> string(0) ""
["tmp_name"]=> string(0) ""
["error"]=> int(1)
["size"]=> int(0)
}
В моих журналах ошибок nginx или php ничего нет.
$_SERVER['content_length']
равно 652844444, что является правильной длиной файла.
Значение 'error'
указано как 1. Я не знаю, равно ли это 1, как в true, или 1, как в соответствующем сообщении об ошибке. В документах php указано сообщение об ошибке для 1 в документах как:
Загруженный файл превышает директиву upload_max_filesize в php.ini.
Но оба:
echo phpinfo();
echo ini_get('upload_max_filesize');
Покажите 1 ГБ, чтобы файл не превышал его, потому что он составляет 562,8 МБ.
Без дальнейших сообщений об ошибках и после выполнения всех инструкций и руководств, которые я могу найти в Google, я в полной растерянности относительно того, что это может быть.
Я также использую Cloudflare, но он отключен для этого поддомена, а ограничения для Cloudflare составляют 100 МБ, а не 500 МБ, поэтому я не думаю, что это как-то связано с этим.
Есть ли какой-либо способ дальнейшей отладки этого? На данный момент я в полной растерянности.
Комментарии:
1. php.net/manual/en/features.file-upload.errors.php в соответствии с этим что-то в вашей конфигурации PHP INI не сработало. Если вы используете PHP-FPM, вам может потребоваться убедиться, что вы меняете правильные конфигурации. Это странно, когда дело доходит до того, что он читает.
2. Это то, что я процитировал? Можете ли вы объяснить, что вы имеете в виду? Если я делаю
ini_get('upload_max_filesize')
на той же странице, что и форма, наверняка используются настройки php.ini.3. Может быть, это что-то с таймаутом? Вы тестируете загрузку на локальном хосте или на внешнем сервере? Вы можете попробовать это: easyengine.io/tutorials/php/increase-script-execution-time
4. Я думаю, вопрос больше похож на то, выполняется
ini_get
ли запуск в том же скрипте, где обрабатывается загрузка?5. Если время ожидания истекло, я бы не смог добраться до файла php и смог
var_dump($_FILES)
бы, не так ли? Из того, что я могу сказать, нет тайм-аута для файлов, которые все равно будут обрабатывать php
Ответ №1:
Итак, я решил это. Действительно очень досадно. Проблема заключалась в том, что я ввел 1GB вместо 1G в php.ini. Сообщений об ошибках не выдавалось, и вообще не было ясно, что он не использует 1 Гигабайт. Но php.ini не распознает такие вещи, как 1 КБ, 1 МБ или 1 ГБ, которые вы должны использовать без B.
Урок усвоен, много времени потрачено впустую.
Ответ №2:
Вы используете облачный / размещенный сервер? Многие размещенные серверы имеют жесткие ограничения на максимальную загрузку файлов, которые они не позволяют переопределить даже с помощью ini-файла. Если вы используете размещенный сервер, вам может потребоваться связаться с вашим хостинг-провайдером, чтобы переопределить ограничение для вас.
Комментарии:
1. Это дроплет digitalocean с Ubuntu 16. Я не верю, что существуют какие-либо такие ограничения. Google ничего не выдал
Ответ №3:
если вы используете плагин для сайта wp, рассмотрите возможность изменения обеих констант в php.in (после wp-config.php обновление не сработало. так много разработчиков предлагают в StackOverflow) после того, как это сработало.ubuntu 20
Расположение
sudo nano /etc/php/7.4/apache2/php.ini
Константа
post_max_size = 1G
upload_max_filesize = 1G