LINUX.ORG.RU
решено ФорумAdmin

nextcloud против лимитов php

 ,


0

1

Доброго времени суток

В процессе дебага наткнулся на ситуацию, которую не могу понять

Есть nextcloud сервер, работающий в связке nginx + php-fpm. В php.ini дефолтные лимиты

upload_max_filesize = 2M
max_execution_time = 30
max_input_time = 60

и я не вижу, чтобы они переопределялись в конфигах php-fpm

Но при этом я спокойно загружаю в nextcloud файл > 20 GiB, и загрузка занимает > 30 мин

И в багтрекере есть тикет, что не получается ограничить размер файла: https://github.com/nextcloud/docker/issues/1014

Вот как это возможно? Я не про багтрекер. Как приложение обошло лимиты php? Или я чего-то фундаментального не понимаю…

★★★★★

Ответ на: комментарий от firkax
  1. кроме php.ini есть и другие места где можно это переопределить

Об этом я и говорю, в nginx и php-fpm не нашёл ничего, что переопределяло бы эти лимиты

  1. файлы 20гб никто одним запросом не шлёт, их режут на куски

Теоретически возможно, но в логе nginx одна строка

В логе nextcloud кстати тоже

router ★★★★★
() автор топика

Ну допустим я могу понять, что не работает лимит max_upload_filesize, т.к. приложение может само обрабатывать данные. У временных файлов даже префикс отличается от дефолтного

Но лимит на время исполнения? Чудеса какие-то

router ★★★★★
() автор топика
Ответ на: комментарий от router

На одном сайте написано что в пхп до 5.3 эти параметры можно было успешно переопределять с помощью ini_set() (сам не проверял). Может быть врут, а может врут и их и в новых пхп можно успешно переопределить, хотя по идее ошибки должны появляться до того как начнёт исполняться код.

Можно ещё попробовать залогировать содержимое $_FILES а начале index.php в какой-нить файл:

file_put_contents("/tmp/upload.log", date("Y-m-d H:i:s ").print_r($_FILES, TRUE), FILE_APPEND);
Возможно, после этого большие файлы перестанут загружаться, если так то значит и правда где-то ini_set().

firkax ★★★★★
()
Ответ на: комментарий от router

Лимит на время выполнения как раз точно ini_set-ом переопределяется. Это самое простое. У лимитов на аплоад проблема в том, что они по идее проверяются до того как у кода будут шансы сделать ini_set(), но может там по-другому сделано как-то так что см. коммент выше.

firkax ★★★★★
()

# grep -r max_execution_time /usr/share/nextcloud

# grep -r set_time_limit /usr/share/nextcloud

# grep -r ini_set /usr/share/nextcloud

алсо, set_time_limit это не конечная константа, она СБРАСЫВАЕТ таймер ограничивающий время выполнения скрипта.

допустим max_execution_time у тебя 30 секунд, ты через 10 секунд задаёшь set_time_limit и оно начинается 0 секунды опять.

оно может сбрасывать этот таймер. это документировано.

Spoofing ★★★★★
()
Ответ на: комментарий от router

Подозреваю что nextcloud режет загружаемый файл на кусочки и/или сбрасывает max_execution_time (как Spoofing уже подсказал)

Собственно(кусок выхлопа из официального докер-контейнера):

root@nextcloud:/var/www/html# grep -r ini_set .
./lib/base.php:                 ini_set('session.cookie_secure', 'true');
./lib/base.php:         ini_set('session.cookie_httponly', 'true');
./lib/base.php:         ini_set('session.cookie_path', $cookie_path);
./lib/base.php:         @ini_set('default_charset', 'UTF-8');
./lib/base.php:         @ini_set('gd.jpeg_ignore_warning', '1');
./lib/base.php:         @ini_set('display_errors', '0');
./lib/base.php:         @ini_set('log_errors', '1');
./lib/base.php:         @ini_set('max_execution_time', '3600');
./lib/base.php:         @ini_set('max_input_time', '3600');
./lib/base.php:         @ini_set('gc_maxlifetime', (string)$sessionLifeTime);

ЕМНИП можно запретить менять max_execution_time через ini_set, но тогда, я подозреваю придется патчить логику самого Nextcloud

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)