Как удалять файлы с сервера по условию, что они не используются в текущий момент?

Здравствуйте!

Такая ситуация - есть сайт event-агентства, на котором можно смотреть видео с различных мероприятий.
Агентство довольно крупное, монополист в своем городе и видео копятся очень быстро. Сейчас они решили размещать все видео на своем Яндекс.Диске, на хостинге 50Гб не хватает, больше покупать не хотят.
Файлы на диске хранятся в архивах.
Недавно я написал такой простой функционал: при открытии страницы какого-то события, PHP-скрипт проверят есть ли файлы события в специальной папке на сервере, если нет, то с помощью API Яндекс.Диска скачивается и распаковывается архив на сервере, формируется плейлист из видео данного события и юзер может их смотреть. Если файлы есть, то просто формируется плейлист.
В среднем видео одного события весят по 1.5-2Гб, не меньше. Т.е. если одновременно заходят посмотреть порядка 20 человек, то место заканчивается.
Я написал еще один скрипт и добавил его в cron, который запускается раз в сутки и удаляет файлы старше 12 часов. Решение так себе.

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

Заранее спасибо за подсказки.

Дополнительно:

TheAndrey7, не поверите, но я им об этом говорил в прямом смысле так "Вы придумываете велосипед", но руководство у них упертое.

  • TheAndrey7, в том то и дело, что на диске все в архивах, из архива нельзя просмотреть прям на диске, поэтому и приходится закачивать их на сервер. Я не против поработать с WS, просто опыта нет
  • TheAndrey7, ну так они решили тоже...мол у одного события может быть по 10-15 видео и грузить все по одиночке им видите ли лень, поэтому грузят архивом. мде
  • Классическое "кроилово ведет к попадалову".
    Что характерно, им даже не нужен какой-то серьезный хостинг или облака - сервер с хранилищем можно поставить буквально у местного провайдера. Или даже у себя же в офисе, купив белый айпишник и обеспечив нормальный канал. Тянуться-то до него будут только местные же.
  • Aljo, плевать какое руководство) Если так вопрос стоит, скажи что это невозможно, либо проси кучу вечно зелёных) Деньги и время им дороже принципов)
  • Владимир, денег я нормально запросил, поэтому и вожусь уже 3-и сутки) Вот решил мнения опытных людей спросить
  • Adamos, да, сам персонал, точнее менеджеры, с которыми я напрямую контактирую - адекватные люди и понимают, что руководство сами себе палки в колеса ставят. Как я понял там дико завышенное ЧСВ, мол "опытные бизнесмены и сами знаем сколько на что выделять".
  • Мне не кажется эта идея здравой. Это стрелять из пушки по воробьям, причем пушка будет через раз промахиваться.
  • Aljo, значит мало запросил, проси больше, манипулируй, сделай их рабами до момента пока не сделают то, что нужно
  • В среднем видео одного события весят по 1.5-2Гб, не меньше. Т.е. если одновременно заходят посмотреть порядка 20 человек, то место заканчивается.

    Причем тут место? Если 1.5-2G, то видео занимает 1.5-2G — почему место заканичвается? 🙂

    залейте в Yandex.Cloud Object Storage и через CDN отдавайте, точнее CDN сам будет отдавать, там сам на лету транскодинг (стрим делать под скорость интернета) будет делать... Оплата будет только за просомтренный ресурс.
    Сервис полностью совместим с AWS S3, так что с библиотеками вообще никаких проблем — все есть и все стабильное

  • Т.е. если одновременно заходят посмотреть порядка 20 человек, то место заканчивается

    Вы один и тот же архив для каждого зрителя качаете что-ли?

  • Я думаю, он имел в виду, если заходят посмотреть 20 разных событий.
    Но вообще тут конечно всего можно ожидать.
  • Так себе решение, но нарегать пачку ящиков, каждый со своим облаком, пусть на 5Гб. Видео для каждого события заливать в свое облако... Ну это так, как вариант для бедных.
    Или почта для домена. Хотя я хз там пространство общее или каждому что-то да выделяют.
  • Шел год в котором для установки брокера сообщений с хранением истории событий рекомендовалось 384 гигабайта оперативной памяти. Оставались люди, которым дорого купить 50гигабайт жесткого диска.
  • Алексей Ярков, нет
  • Ипатьев, да, верно. Я имел в виду, что заканчивается место на хостинге, если условно 20 человек зайдут посмотреть 20 разных событий.
  • В таких условиях надо делать вытесняющий кэш.
    Если при запросе нового файла выясняется, что для него нет места, то удаляется самый старый файл.

    Хотя конечно непонятно, как это всё поможет в ситуации, когда заходят посмотреть сразу 20 разных событий.

    • Спасибо решил задачу с помощью WebSocket и уговорил таки докупить места

    А вот что выглядит вкусным
    https://github.com/jack-theripper/yandex

    Сначала я думал что это жесткий REST-api, в котором есть "дай список", "закачай", "отдай" и "удали". Но там лежит вкусная папка Stream.... где есть метод "считать несколько байт прямо с диска".

    Вот если они продолжат в архиве класть 5 видео, а не в папке, то этот функционал вам недоступен и вы в тупике. Но если это будут видеофайлы, то вы можете открывать соединение с яндекс диска через страницу на вашем сайте, где заголовками отдавать что "получаемый файл есть видео, и content-length неизвестен". В теории подрубившись плеером к этому стриму вы внезапно сможете считывать его по чуть-чуть, в результате будете ограничиваться уже толщиной канала и оперативной памятью, куда будут временно выгружаться данные по кускам, а не жестким диском.

    Но я не проверял, работает ли это вообще, а с видео давно бы уже пора мне научиться работать.

    По сути это вытесняющий кеш и будет как сказал Ипатьев. Но это будет кеш который в моменте хранит только например 8килобайт на юзера.

    А если вы как и сказали - подключите сюда еще сокеты (не веб-сокеты, а просто сокеты, tcp например), то вы еще и предотвратите отдачу целого фильма в скрипте даже если пользователь перестал смотреть. Вы просто в шаге цикла while () сможете проверять - есть ли кому контент слать. И если некому то прекращаете чтение.

    • Круто, спасибо, ознакомлюсь. Пока решили задачу с помощью WebSocket

     

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

     

      • Как удалять файлы с сервера по условию, что они не используются в текущий момент?Есть ответ
      • 09.04.2024
      Ответить

      Для удаления файлов с сервера по условию, что они не используются в текущий момент, можно воспользоваться следующим подходом:

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

      2. После определения неиспользуемых файлов, можно создать скрипт, который будет удалять их. Например, можно использовать функцию unlink() в PHP для удаления файлов.

      Пример кода на PHP для удаления файлов с сервера по условию:

      $directory = '/path/to/directory/';
       
      // Получаем список файлов в директории
      $files = scandir($directory);
       
      foreach ($files as $file) {
          if ($file != '.' && $file != '..') {
              $file_path = $directory . $file;
       
              // Проверяем, используется ли файл
              $is_used = // Проверка на использование файла
       
              if (!$is_used) {
                  unlink($file_path); // Удаляем файл
                  echo 'Файл ' . $file . ' удален.<br>';
              }
          }
      }

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

      • Как удалять файлы с сервера по условию, что они не используются в текущий момент?Есть ответ
      • 07.04.2024
      Ответить

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

      1. Анализ использования файлов:
      Прежде чем удалять файлы, необходимо провести анализ использования файлов на сервере. Для этого можно воспользоваться утилитами, которые могут отслеживать активность файлов, такими как lsof (list open files) или fuser (file user). Эти утилиты помогут определить, какие процессы используют конкретные файлы в данный момент.

      2. Планирование удаления файлов:
      После того как вы определили неиспользуемые файлы, можно запланировать их удаление. Для этого можно написать скрипт на bash, python или другом языке программирования, который будет периодически проверять, какие файлы не используются, и удалять их при необходимости. Например, можно использовать cron (для Unix-подобных систем) или Task Scheduler (для Windows) для запуска скрипта удаления файлов по расписанию.

      3. Использование инструментов для автоматизации удаления:
      Существуют специальные инструменты для автоматизации удаления файлов на сервере, такие как Ansible, Puppet, Chef и другие. Они позволяют настраивать и управлять серверами с помощью кода, что упрощает процесс удаления неиспользуемых файлов.

      4. Резервное копирование файлов перед удалением:
      Прежде чем удалять файлы, рекомендуется сделать их резервное копирование. Таким образом, вы сможете вернуть удаленные файлы в случае их случайного удаления или ошибки.

      5. Удаление файлов с помощью командной строки:
      Если вы предпочитаете использовать командную строку для удаления файлов, то для этого можно воспользоваться командами rm (для Unix-подобных систем) или del (для Windows). Однако перед выполнением этих команд убедитесь, что файлы действительно не используются, чтобы избежать удаления важных данных.

      6. Мониторинг использования файлов:
      Для предотвращения удаления активно используемых файлов можно настроить мониторинг использования файлов на сервере. Существует множество инструментов для мониторинга файловой системы, такие как Nagios, Zabbix, Prometheus и другие, которые позволяют отслеживать активность файлов и предупреждать о возможных проблемах.

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

    Оставить комментарий