Лучший подход для быстрой отладки и эффективного исправления ошибки загрузки больших файлов изображений - PullRequest
3 голосов
/ 19 октября 2010

Рассмотрим нормальную функциональность загрузки изображений PHP (без использования AJAX), и иногда возникает проблема сбоя при загрузке больших изображений - реже на одном тестовом сервере и чаще на другом тестовом сервере.Предполагая, что отладчик еще не начал отладку проблемы, и нет никаких проблем с правами доступа к файлам / папкам, как продолжить?

Я уверен, что file_uploads включен.Я не хочу просто слепо устанавливать некоторые безопасные значения или увеличивать значения до тех пор, пока это не сработает.По сути, я хочу, чтобы значения были точно такими, как указано в моих соответствующих модулях.Я готов переопределить настройки в моих соответствующих модулях, если это лучший подход.

В соответствии с настройками, относящимися к загрузке файла , это все соответствующие / связанные настройки -
* file_uploads
* upload_max_filesize
* max_input_time
* memory_limit
* max_execution_time
* post_max_size

  1. Поиск параметров / значений для соответствующего сценария -
    Чтобы я мог выяснить, какой из них / сколько из них на самом деле нарушено моим сценарием и вызвало ошибку, мне нужноСначала найдите соответствующие значения для моего скрипта.Как найти следующие значения для моего скрипта:

    • Общий размер загруженных файлов
    • Время ввода
    • Использование памяти
    • Время выполнения скрипта
    • Размер опубликованных данных

    Какой инструмент (ы) можно использовать для одного и того же.С помощью кода PHP, я думаю, я могу найти несколько:

    • Время выполнения скрипта - Разница между microtime(true) в начале и конце скрипта.
    • Общий размер загруженного файла - ForeachЦикл на $_FILES, чтобы найти сумму атрибута ['size']

    Как узнать остальное, как использование памяти, время ввода и т. д.?

  2. Где / Как переопределить
    Наконец, когда я нашел нарушающие настройки, предположим, мне нужно увеличить / переопределить значения для 2 изнастройки.Где применить переопределение?Я предполагаю, что неправильно устанавливать memory_limit и т. Д. Для всех модулей в htaccess или в скрипте PHP.Скорее, лучше применять только в соответствующем модуле.Я прав?

  3. Настройки для менее требовательных модулей
    Кроме того, для других модулей, где не требуется много ресурсов, целесообразно ли переопределить настройки для уменьшенияих, после тщательного изучения требований к ресурсам модулей?Снизит ли это потребление ненужных ресурсов?Если да, то как насчет двух или трех комбинаций этих настроек (в зависимости от требований проекта, именования их normal-script, heavy-file-upload) и вызова одной функции для загрузки любой комбинации для каждого модуля?

  4. меры предосторожности при ограничении памяти
    Относительно memory_limit здесь упоминается, что -

    Установка слишком высокого значения может быть очень опасной, потому что если несколькозагрузка выполняется одновременно, вся доступная память будет израсходована, и другие несвязанные сценарии, которые занимают много памяти, могут также повлиять на весь сервер.

Какие общие меры предосторожности предпринятьоб этом?

Спасибо,
Sandeepan

1 Ответ

1 голос
/ 19 октября 2010

Несколько идей для отладки:

Для ручного тестирования я бы подготовил серию изображений с различными размерами, размер которых (ширина х высота) увеличивается небольшими шагами: 100 х 100, 100 х 200,100 х 300 .... и попробуй их.В какой-то момент они могут начать сбой, если проблема заключается в ограничении памяти.Вы можете включить error_reporting() только для себя (возможно, используя какой-то файл cookie для отладки), чтобы увидеть, что именно не получается.

Если это не вариант, я бы долго настраивал какой-то механизмрегистрация, которая сохраняет размеры изображения в файл журнала или таблицу до начала изменения размера, а также содержимое массива $_FILES.После успешного завершения сценария добавьте «OK» к этой записи.Таким образом, вы сможете узнать больше о неудачных загрузках, если они дойдут до сценария (и не потерпят неудачу заранее из-за настройки тайм-аута).

Также длядругие модули, где много ресурсов не требуется, это правильно / разумно переопределить настройки, чтобы уменьшить их

Я думаю, что ответ всегда "нет".Насколько я знаю, предел памяти - это максимальный предел памяти, который может быть выделен, но этот объем не зарезервирован для каждого запроса.Я никогда не слышал, чтобы кто-нибудь так точно настраивал ограничение памяти.

Однако, если некоторым частям системы (например, средству изменения размера изображения) требуется чрезвычайно высокий предел памяти, может быть целесообразно применить к ним определенные настройки memory_limit, например, через a * 1017.* настройка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...