Храните сотни версий на сервере: какое сжатие использовать?

Для онлайн-проекта текстового редактора, который я строю, экономия проектов похож на то, что делает http://jsfiddle.net :

  • первая версия sdf23f,
  • второй Save приводит к sdf23f/1, третий Save приводит к sdf23f/2, так далее.

Когда кто-то бьет Saveвызывается файл PHP, который сохраняет данные на сервере:

<?php if(!empty($_POST['data'])){
$data = $_POST['data'];
$fname = $_POST['id'];
$file = fopen("data/" . $fname, 'w');
fwrite($file, $data);
fclose($file);
}
?>

Тогда в одной папке будут сотни версий (то есть сотни похожих файлов).

На каком этапе должно выполняться сжатие, чтобы сэкономить память сервера?
Что за компрессия? Внутри PHP, или сжатие должно быть обработано чем-то другим?

0

Решение

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

Хм … прежде чем сохранить файлы.

Внутри PHP, или сжатие должно быть обработано чем-то другим?

Я уверен, что вы могли бы реализовать подходящее «сжатие» внутри PHP … если бы вы знали, что делаете. Но существуют также утилиты для подобных вещей (конечно, в Linux / Unix …)

Но я думаю, что вам действительно нужно знать, какую технику «сжатия» использовать. И ответ заключается в том, что способ экономии места при хранении нескольких версий текстового файла состоит (как правило) для хранения различия между последовательными версиями, а не полными версиями. Таким образом, вы можете хранить:

  • Полная последняя версия (скажем, версия N).
  • Отличия от версии N до версии N — 1
  • Отличия от версии N -1 до версии N — 2.
  • и так далее.

Затем можно сжать (в общепринятом смысле) базовый файл и различия, хотя, если файлы различий малы, они не будут сжиматься очень сильно.

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

Стандартный способ решения этой проблемы заключается в использовании формата «архив» (например, tar или zip), который может хранить несколько «файлов» в одном архиве. Затем вы можете сжать архив, чтобы сэкономить место. (Хотя сжатие уже сжатых файлов не поможет …)


@Rasclatt прокомментировал:

Почему бы вам не сохранить в базу данных вместо этого?

Что ж:

  • Использование базы данных напрямую не решает проблему использования пространства как таковой. (Если база данных не поддерживает сжатие.)

  • Затем вам нужно получить доступ к файлам через базу данных … что обычно медленнее, чем если вы читаете их непосредственно из файловой системы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]