Работа с файлами внутри каталога /tmp

Я пытаюсь проверить содержимое загруженного ZIP-файла, а затем сохранить его в нужном каталоге.

Мой вопрос: могу ли я переименовывать, извлекать файлы внутри каталога tmp/? Будут ли файлы удалены автоматически?

Я просто хотел бы знать, что происходит с файлом, который я сам создал в каталоге tmp/.

Текущий процесс:

  • Переименовать tmp_name в ...['tmp_name'].zip (if not exists)
  • Удалить файл ...['tmp_name'].
  • Распакуйте zip в папку с именем ...['tmp_name'], файл уже удален.
  • Удалить .zip файл
  • Проверить содержимое внутри папки.
  • Переместите или удалите извлеченную папку.

person gskema    schedule 26.03.2015    source источник
comment
Да, это возможно, но процесс, которым вы следуете, намного лучше, чем то, о чем вы спрашиваете?   -  person Anant Kumar Singh    schedule 26.03.2015
comment
Я просто хотел бы знать, что происходит с файлом, который я сам создал в каталоге tmp/.   -  person gskema    schedule 26.03.2015


Ответы (2)


Как вы можете прочитать здесь:

В большинстве систем этот каталог очищается при загрузке или завершении работы локальной системы.

Но, как говорится в документации, на уровне Linux не так много указано, это зависит от дистрибутива. Большинство серверов редко перезагружаются, поэтому папка /tmp может превратиться в беспорядок, занимающий некоторое (значительное количество) дисковое пространство. Однако большинство систем Linux позволяют установить переменную TMPTIME: количество дней, в течение которых файл может сохраняться в /tmp. Таким образом, при установке переменной в 1 файлы старше одного дня автоматически удаляются (хотя, вероятно, не через одну секунду после того, как им исполнится один день). Подробнее см. в этом ответе.

Короткий ответ: файлы являются частью файловой системы. Обычно они не удаляются автоматически, только при перезагрузке или когда они достаточно старые. Это делается для того, чтобы, когда вам нужно выполнить несколько действий с файлами, они не исчезли посреди этого. Хотя никто, конечно, никогда полностью не знает.

Таким образом, вы должны убедиться, что вы даете своим файлам разные имена: если два процесса происходят одновременно, они не должны взаимодействовать. Например, используйте случайное число, чтобы первый файл назывался zip151323.zip, а второй — zip4745443233.zip.

person Willem Van Onsem    schedule 26.03.2015
comment
Таким образом, в основном пользовательские файлы, созданные пользователем (могут) быть стерты системой при перезагрузке сервера; и загруженные файлы стираются в конце скрипта (насколько я знаю). Если я могу делать свое дело и уйти за шестьдесят секунд :), что означает, что я удалю все, что создал, со мной все будет в порядке? - person gskema; 26.03.2015
comment
да. Но вам, таким образом, нужно удалить файлы вручную (или дождаться, пока ОС сделает это за вас). Но все же вы должны убедиться, что имена файлов не конфликтуют. Скажем, два пользователя загружают файл почти одновременно, два запущенных сценария могут конфликтовать (например, первый сценарий обрабатывает разархивированное содержимое, когда второй сценарий распаковывает файл и, таким образом, создает дополнительные файлы в каталоге). - person Willem Van Onsem; 26.03.2015
comment
Это не должно быть проблемой, потому что PHP уже создает уникальное имя для загруженного файла; Единственное, на что мне нужно обратить внимание, это создание уникальных имен папок при извлечении. Спасибо за ответ. - person gskema; 26.03.2015
comment
Это полностью зависит от вашей системы и конфигурации PHP. Этот ответ делает ряд предположений, которые на самом деле не могут быть сделаны. Проверьте, куда ваша конфигурация PHP указывает файлы, проверьте, что ваша операционная система делает по умолчанию и как она настроена. Вы можете в конечном итоге опубликовать на другом форуме, чтобы проверить детали! Например, кто бы ни устанавливал ОС, /может/ добавить функциональность для очистки файлов. @CommuSoft на самом деле не знает ни того, ни другого. Мы даже не знаем, используете ли вы Windows или Linux, не говоря уже о дистрибутиве/версии/конфигурации! - person button; 26.03.2015
comment
@button Я пишу модуль приложения PHP, который будет использоваться в разных системах, но обычно на серверах Linux. - person gskema; 26.03.2015
comment
@gskema Тогда вы захотите указать в документации требования к временной папке, которую вы используете - конечно, если вы используете ее для чего-либо помимо быстрой обработки. Я нахожу приведенный выше ответ немного вводящим в заблуждение в этом отношении, он предполагает, что PHP поддержит вас в этом отношении, чего не будет. - person button; 26.03.2015
comment
@button: где ты это прочитал. Он всегда говорит, что большинство дистрибутивов и даже прямо говорит, что мало что указано, кроме стандарта POSIX, конечно... PHP вообще не упоминается... - person Willem Van Onsem; 26.03.2015
comment
@button Это (своего рода) быстрая обработка: извлеките архив .zip, проверьте ~ 100 изображений, файлов xml, а затем переместите или удалите папку и другие созданные файлы. - person gskema; 26.03.2015
comment
@CommuSoft вопрос касается поведения, демонстрируемого PHP, которое PHP не контролирует. Ответ действительно «никто не знает». Но совет заключается в том, что обычно он загружается для дистрибутивов Linux (хотя я не имею ни малейшего представления о Windows...). Например, PHP не обязательно должен использовать /tmp, вы можете указать, чтобы он перешел в другое место, если вы того пожелаете. ~~ В этом конкретном случае вопрос задает кто-то, кто не контролирует ОС или ее поведение; таким образом, лучший совет, который я могу дать, - указать, что требуется для создаваемой библиотеки, чтобы ее можно было использовать без проблем. - person button; 26.03.2015
comment
С моей менее добросовестной шляпой, я бы сказал, что они будут в порядке, просто не беспокоясь об этом, пока библиотека убирает за собой. Но это их решение, с максимально возможной информацией, которую мы можем предоставить :p. - person button; 26.03.2015
comment
@button: вопрос сводится к тому, что происходит с файлами в папке /tmp, происходят ли эти файлы из скрипта PHP или Haskell, не имеет значения. Ответ заключается в том, что в целом об этом мало что можно сказать. Но в документации Linux прямо указано, что дистрибутивы требуют, по крайней мере, удалять файлы во время загрузки. - person Willem Van Onsem; 26.03.2015
comment
@CommuSoft Я согласен не согласиться с интерпретацией вопроса :). Насколько я могу судить, мы говорим об одном и том же, но с разных точек зрения. Каталог /tmp нельзя использовать в Windows AFAIK, поэтому, как я вижу, его сторона PHP имеет некоторое значение. - person button; 26.03.2015

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

Из http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir :

upload_tmp_dir строка Временный каталог, используемый для хранения файлов при загрузке файлов. Должен быть доступен для записи любому пользователю, от имени которого работает PHP. Если не указано, PHP будет использовать системное значение по умолчанию.

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

Короче говоря, это зависит от вашей операционной системы и конфигурации, поскольку это всего лишь указатель на папку где-то в вашей системе — PHP не справится с этим за вас. Многие удаляют файлы только при запуске, поэтому вам, вероятно, следует быть осторожным с очисткой после распаковки (или использовать что-то для очистки мусора).

Если вы создаете библиотеку или модуль для общего повторного использования, вам нужно будет указать в документации требования к временной папке, которую вы используете — конечно, если вы используете ее для чего-либо помимо быстрой обработки. (Т.е. вам, вероятно, удастся просто написать код и забыть о нем, но если вы хотите оставаться в безопасности...).

person button    schedule 26.03.2015