Хороший способ справиться с ситуацией с временным файлом в PHP

У меня есть PHP-скрипт, в котором пользователь может загрузить изображение. Это изображение хранится во временном каталоге и возвращается пользователю. Затем пользователь может использовать интерфейс javascript для обрезки изображения. (x1,y2)(x2,y2) отправляется сценарию, который используется для обрезки изображения. Затем он возвращается пользователю для другого предварительного просмотра и/или кадрирования. Как только пользователь будет достаточно удовлетворен, он нажмет «Сохранить». Временный файл копируется в оригинал, а временный удаляется. Это не изображения для каждого пользователя, а изображения оборудования. Любой пользователь в организации может заменить любой образ оборудования. Этот подход хорош, но есть несколько проблем:

1) Допустим, пользователь загружает изображение для предварительного просмотра, но затем закрывает окно браузера. У меня останется временный файл. Это может стать проблемой. Конечно, я могу очистить их с помощью CRON, но теоретически у меня может быть куча временных файлов (это некрасиво). Cron также может удалить временный файл пользователя во время редактирования.

2) Чтобы справиться с номером 1, я всегда могу иметь временный файл для каждой единицы оборудования, например, equip1.temp и equip1.jpg. Все загрузки хранятся в equip1.temp, все коммиты переносятся в equip1.jpg. Если два пользователя одновременно пытаются загрузить изображения одного и того же оборудования, это может их испортить (крайне маловероятно + не проблема, но все же некрасиво).

3) Я всегда могу передать изображение туда и обратно (пользователь «загружает» изображение, и оно возвращается как <img src="base64....." />. Полученные правки + исходная строка base64 отправляются обратно в PHP для обработки). Это решение устраняет проблему с временными файлами, но я заметил, что для отправки изображений в высоком разрешении туда и обратно требуется несколько секунд.

Как бы вы справились с этой ситуацией?


person user974896    schedule 04.10.2012    source источник
comment
используйте вариант № 2, но также включите user id в имя файла, например equip1-user123.temp.   -  person air4x    schedule 04.10.2012
comment
Что, если пользователь 123 покинет компьютер и больше никогда не вернется? Временный файл будет висеть вечно. При N многих пользователях имеется N*#ofequip файлов   -  person user974896    schedule 04.10.2012
comment
если пользователю разрешено редактировать только одно изображение за раз, вы можете сохранить имя файла в пользовательской таблице. затем регулярно запускайте cron, который удаляет все файлы, отсутствующие в пользовательской таблице.   -  person air4x    schedule 04.10.2012
comment
Хорошая идея. Как мне поступить, если пользователь редактирует изображение и просто уходит? Файл будет находиться в пользовательской таблице неограниченное время. Если все N пользователей сделают это, у меня все еще будет та же проблема. И наоборот, у меня был cron, который просто удалял временные файлы каждые X секунд, когда пользователь может находиться в процессе редактирования, и его изменения стираются.   -  person user974896    schedule 04.10.2012
comment
вам также понадобится временная метка last login в таблице. По прошествии месяца или двух без входа пользователя в систему удалите его временные файлы.   -  person air4x    schedule 04.10.2012


Ответы (2)


Я бы не рекомендовал № 3 по причинам, которые вы упомянули.

Я предлагаю вам сделать это вместо этого:

  1. Пользователь загружает файл со случайным временным именем. equip1.jpg сохраняется как equip1_fc8293ae82f72cf7.jpg. Убедитесь, что ваш скрипт будет жонглировать обоими именами файлов. Это позволит двум пользователям загружать одно и то же оборудование, причем последний загрузивший становится победителем, но при этом не возникает конфликтов.
  2. Каждый раз, когда ваш обрезчик работает с временным изображением, вы должны «прикоснуться» к нему, чтобы обновить измененное время.
  3. Позвольте пользователю закончить свои правки, переместите временный файл вместо имени окончательного изображения.
  4. Имейте cron или раздел вашего скрипта загрузки, который удаляет заброшенные временные файлы, у которых mtime старше часа или около того. Вы предполагаете, что это беспорядочно из-за большого количества временных файлов, но ожидаете ли вы, что многие изображения будут заброшены? Сборка мусора — очень стандартный метод решения этой проблемы.
person jimp    schedule 04.10.2012
comment
Если пользователь загрузит, обрежет, просмотрит и не сделает коммит до › часа (он должен был пойти на встречу), то его работа будет потеряна. - person user974896; 04.10.2012
comment
Я сказал час, потому что подумал, что вы беспокоитесь о космосе больше всего на свете. Вы можете установить его на 24+ часа. В какой-то момент вам придется обработать эту ошибку, если пользователь вернется после выходных, но в большинстве ситуаций это сработает очень хорошо. - person jimp; 04.10.2012

У меня была похожая проблема, как это. Если я правильно помню (это было давно), я создал таблицу в БД для хранения имен файлов и сеансовых ключей/времени. При каждой загрузке скрипта, если в базе данных была мертвая сессия, соответствующая сессия и изображение/файл удалялись.

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

person thatonefreeman    schedule 04.10.2012