- PHP Удаление файла через 24 часа после загрузки
- 4 ответа
- Удаление файлов через определенное время?
- Войдите, чтобы написать ответ
- Как исправить ошибку php Call to a member function bind_param() on boolean in?
- Автоматическое удаление всех файлов после x-времени
- 7 answers
- PHP. Удаление файлов сессий по CRON
- Отключение стандартного механизма чистки сессий
- Удаление сессий PHP по CRON запросу
- Публикации из этого раздела:
- 2 комментариев к “ PHP. Удаление файлов сессий по CRON ”
PHP Удаление файла через 24 часа после загрузки
Я сделал простой скрипт, который позволяет пользователям загружать HTML-файлы в веб-каталог на моем сервере. Тем не менее, я бы хотел, чтобы каждый файл был удален через 24 часа на моем сервере. 24 часа для каждого файла, а не 24 часа для всего каталога. Вот мой код. Спасибо за вашу помощь.:)
"; echo "Type: " . $_FILES["uploaded"]["type"] . "
"; echo "Size: " . ($_FILES["uploaded"]["size"] / 1024) . " Kb
"; echo "Location: /users/" . $_FILES["uploaded"]["name"]; > else < echo "Sorry, " . $_FILES["uploaded"]["name"] . " is not a valid HTML document. Please try again."; unlink . $_FILES["uploaded"]["name"]; >?>
4 ответа
Включите следующий скрипт в конце вашего скрипта. Не забудьте заменить /var/www/uploads/ с правильным путем. В противном случае все файлы будут удалены в другом месте.
$files=shell_exec('find /var/www/uploads/ -mmin +1440'); $file = explode("\n",$files); if(isset($file) && is_array($file)) < foreach($file as $val) < @unlink($val); >>
Приведенный выше код будет работать на хостинге на базе Linux/UNIX.
- «shell_exec» выполнит команду linux и вернет выход
- «find -mmin -1440» ищет файлы старше 1 дня или 1440 минут
- Путь к первой строке «/var/www/uploads/» необходимо заменить полным путем к каталогу.
- Отмена связи имеет знак «@», чтобы избежать предупреждения, если файл там не существует.
- Так как это мощная команда на основе Linux, проверьте правильность путей.
Удаление файлов через определенное время?
Здравствуйте. Есть хостинг изображений (приведем в пример), и надо, чтобы через определенное время (ну, 5 дней) файлы в папке удалялись.
Ну можно и другой вариант, если в папке более 100мб (например), то файлы опять удалялись.
Можно как-то это сделать? В моих интересах через .htaccess, но я приму любые другие варианты.
Какая нафиг база? Какой PHP? Зачем это всё здесь? Денормализовать данные файловой системы, сделать решение не поддерживаемыми, хромым на обе ноги и склонным к глюкам?
find /путь/к/каталого/с/файлами -mtime +5 -delete
А вообще man finde конечно.
Поясняю: для пользователей похапе файл .htaccess олицетворяет универсальный интерфейс управления веб-сервером. Хотя на саморм деле он имеет в виду крон 🙂
Ilya Korablev: Могу только предложить прочитать мой комментарий сначала, а не с конца. Вам нужно вести учет загружаемых файлов, а когда учет будет готов — удалять старые файлы с помощью cron задачи по расписанию.
Cron — это планировщик задач в *nix системах. То есть при помощи него задачи можно исполнять с определёнными интервалами или в определённое время. PHP скрипт можно исполнить передав его адрес напрямую в интерпретатор (не используя веб-сервер).
Создаёте таблицу в БД, куда будете вносить данные о загружаемых файлах: имя, дату загрузки, размер. Пишете PHP скрипт, который будет выбирать записи из БД, соответствующие определённым условиям (загруженные более 5 дней назад; последние записи, суммарный размер которых составляет 100 мб.). Затем в цикле удаляете эти файлы функцией unlink.
Теперь осталось создать задачу для крона. Например, будем каждый день в полночь проводить чистку. В панели управления сервером выбираете нужный интервал. В качестве команды укажите путь к интерпретатору с параметром — путь к скрипту, который будет чистить. Например: /usr/bin/php /home/user/www/cleaner_cron.php
Путь к интерпретатору ищите в FAQ’е хостинга или же спросите в службе поддержки
Можно и без крона: при сохранении очередного файла запускать заодно чистку. Причём чистка не обязательно должна быть полной: достаточно стереть несколько подлежащих удалению старых файлов. Ведь этот процесс запускается при каждом сохранении нового файла.
Для ускорения чистки можно при сохранении именовать новый файлы таким образом, чтобы они были отстортированы по времени создания, например, в подпапки по дням, и по времени:
date('Ymd/His-') . substr( md5_file( $tmp_filename), 0, 4)
Войдите, чтобы написать ответ
Как исправить ошибку php Call to a member function bind_param() on boolean in?
Автоматическое удаление всех файлов после x-времени
Как вы автоматически удаляете все файлы в подкаталоге по истечении времени x (скажем, через 24 часа) — без использования команды cronjob с сервера или pl. Как вы можете сделать это, просто используя PHP-код или просто посетив страницу, не нажимая на что-либо, и команда автоматически запускается.
7 answers
Ответ на последний комментарий из моего первого ответа. Я собираюсь написать пример кода, поэтому я создал еще один ответ вместо добавления еще одного комментария.
Чтобы удалить файлы с пользовательским расширением, вам необходимо реализовать код:
Комментарий: 1. В этом примере используется регулярное выражение /\.txt$/i , что означает, что будут удалены только файлы с расширением txt . знак «$» означает, что имя файла должно заканчиваться строкой «.txt». Флаг «i» указывает, что сравнение будет будьте нечувствительны к регистру. Подробнее о функции preg_match().
Кроме того, вы можете использовать функцию strripos() для поиска файлов с определенным расширением. Вот фрагмент кода:
Комментарий: Этот пример кажется более очевидным. Результат strripos() также может быть достигнут с помощью объединения двух функций: strrpos(strtolower($file), ‘.txt’) , но, ИМХО, хорошее правило — использовать меньше функций в своем коде, чтобы сделать его более читаемым и меньшим. Пожалуйста, внимательно прочитайте предупреждение на странице функция strripos() (блок возвращаемых значений).
Еще одно важное замечание: если вы используете систему UNIX, удаление файлов может завершиться неудачей из-за прав доступа к файлам. Вы можете проверить руководство о функции chmod().
PHP. Удаление файлов сессий по CRON
PHP удаляет старые сессионные файлы «на хитах». То есть при каждой загрузке страницы сайта. А если сайт имеет большую посещаемость, то PHP приходится обрабатывать за один хит десятки гигабайт данных, что замедляет сайт. Но есть отличное решение — вынести эту процедуру на планировщик CRON и блокировать её выполнение на хитах.
Примеры в этой статье будут полезны тем, кто хранит сессии PHP стандартным способом: в файлах. Как это делаю я. В статье «Зачем хранить сессии в базе данных?» писал о том, что совершенно не согласен с теми, кто хранит PHP сессии в оперативной памяти (ОЗУ). На сайте с посещаемостью 10 000 в день и длительностью хранения сессии в 3 месяца размер всех сессионных файлов достигает нескольких десятков гигабайт. Если запихнуть это исполинское количество данных в ОЗУ, то сервер начнёт горько плакать. Конечно, если Вы не миллиардер с гипер огромным и дорогим сервером. Поэтому разбираем случай для тех, кто хранит сессии в файлах.
Отключение стандартного механизма чистки сессий
У PHP есть две директивы: session.gc_probability и session.gc_divisor. Они и задают периодичность (а точнее вероятность) удаления старых сессий. Наша задача выставить их в такое значение, чтобы они никогда не инициировали удаление старых сессий. Потому что удалять их будем другим инструментом, через CRON скрипт.
session.gc_divisor в сочетании с session.gc_probability определяет вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor, то есть 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100.
Поэтому для остановки механизма очищения сессий достаточно задать session.gc_probability = 0. Делается это в файле .htaccess, в корневой директории сайта:
php_value session.gc_probability 0
Теперь стандартный механизм очищения сессии не будет работать при загрузке страниц сайта. Но если оставить всё как есть, то папка с сессиями начнём бесконечно расти, пока у сервера не закончится дисковое пространство. Поэтому быстро переходим к следующему шагу — написанию своего запроса на удаление старых сессий.
Удаление сессий PHP по CRON запросу
Сразу приведу пример CRON команды, которую использую для удаления старых сессий на проекте со временем жизни сессии в 90 дней:
0 * * * * alexgur /usr/bin/php -d session.save_path=/tmp/php_sessions/alexgur.ru -d session.gc_probability=1 -d session.gc_divisor=1 -d session.gc_maxlifetime=7776000 -r «session_start(); session_destroy();» &>/dev/null
Теперь разберём всю строку по порядку:
- 0 * * * * — означает, что запускается команда раз в час
- alexgur — имя пользователя, от которого запускается команда. Имя должно совпадать с именем пользователя, от которого выполняются скрипты сайтов. Иначе доступа к сессионной папке у пользователя не будет, и скрипт не сработает — нет прав доступа.
- /usr/bin/php — обработчик php
- -d session.save_path=/tmp/php_sessions/alexgur.ru — директива, которая указывает на папку, где хранятся сессии сайта. Если не знаете, где у сайта хранятся сессии, то вызовите phpinfo() и найдите значение «session.save_path»
- «-d session.gc_probability=1» и «-d session.gc_divisor=1» — оба значения ставим одинаковыми, чтобы при делении получить 100%. Тогда в 100% случаев будет запущен процесс удаления старых сессий
- -d session.gc_maxlifetime=7776000 — директива, определяющая максимальную продолжительность жизни сессии. Время жизни сессии — это количество секунд, прошедшее с последнего изменения сессионного файла. 7776000 секунд — это 90 дней. По умолчанию gc_maxlifetime = 1440. Обязательно выставите то значение, которое используется на сайте, иначе сессии будут удаляться раньше, чем нужно.
- -r «session_start(); session_destroy();» — необходимо вызвать функцию создания сессии, чтобы инициировать процессы удаления. Говорят, что ещё в PHP 7 версии есть специальная функция для запуска чистильщика сессий «session_gc();». Но я решил не рисковать в этом примере, а то вдруг кто-то ещё сидит на PHP старых версий.
- &>/dev/null — заставляет оба потока вывода отправляться в небытие. Ведь нам ничего не нужно выводить в CRON журнал после выполнения этой команды.
Дело сделано! Теперь при загрузке страниц сайта PHP не будет сканировать десятки гигабайт сессионных файлов, чтобы найти и удалить просроченные.
Публикации из этого раздела:
- Часовой пояс сервера CentOS 7 — Если у сервера не настроить часовой пояс, то появится целый ворох проблем после запуска проекта. Рас.
- Как посмотреть DNS записи домена — Чтобы посмотреть DNS записи домена введите в командной строке Linux следующую команду: dig alexgur.r.
- Linux. Кто сидит на портах? — Контроль всех входов и выходов — это основа безопасности. Поэтому для определения уровня защищённост.
- Яндекс.Почта для доменов — Каждый раз при создании сайта возникает вопрос об электронной переписке. Использовать личный почтовы.
- Bitrix загрузить файл в свойство через форму — Загрузка файла на сайт — это довольно рядовой процесс. Но как загрузить пользовательский файл в свой.
- Bitrix. Переход на ядро D7. Как приспособиться к ORM — Люди готовы отказаться от улучшений качества жизни из-за необходимости делать хоть какие-то перемены.
- rDNS. Что это и как настроить — Проблема мэйл-спама растёт с каждый днём. Количество спама не уменьшается, а способы обхода спаморез.
- Зачем хранить сессии в базе данных? — Отвечу сразу: не надо хранить сессии в базе данных. Для большинства сайтов достаточно использовать с.
2 комментариев к “ PHP. Удаление файлов сессий по CRON ”
Зачем шарудить файлы каждый час если время жизни сесси исчисляется десятками дней? От того что конкретная сессия удалится часом позже или часом раньше уже ни чего не изменится. В сравнении с 90 днями — это мелочи. Учитывая что при таком огромном времени жизни сессий, в папке явно тысячи файлов, процедура просмотра всех их, и выявления старых — довольно дорогая. Разумнее было бы запускать очистку раз в сутки часа в 4 утра — когда минимальный онлайн.
4 4 * * *