PHP записывает большое количество файлов в один каталог - PullRequest
2 голосов
/ 29 июля 2009

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

$file = "../cache/".$id.".htm";
$handle = fopen($file, 'w');
fwrite($handle, $temp);
fclose($handle);

($ id - случайная строка, назначаемая строке в базе данных)

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

Простые вопросы, я полагаю, но я не хочу масштабировать этот код, а потом выяснить, что я делаю это неправильно, в настоящее время я тестирую только с разбивкой по 10-30 страниц.

Ответы [ 4 ]

3 голосов
/ 29 июля 2009

Помните, что в UNIX все является файлом.

Когда вы помещаете столько файлов в каталог, что-то должно отслеживать эти файлы. Если вы делаете: -

ls -la

Вы, вероятно, заметите, что '.' вырос до некоторого размера. Здесь хранится вся информация о ваших 10000 файлах.

Каждый поиск и каждая запись в этот каталог будет включать в себя анализ этой большой записи в каталоге.

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

например.

/ somedir / A / B / C / yourfile.txt /somedir/d/e/f/yourfile.txt

Это позволит сохранить размер каждой записи каталога достаточно маленьким и ускорить операции ввода-вывода.

1 голос
/ 29 июля 2009

Количество файлов, которые вы можете эффективно использовать в одном каталоге, не определено. система, но зависит от файловой системы.

Вы можете эффективно разделить каталог кеша, получив хэш md5 имени файла, взяв первые 1, 2 или 3 символа и используя его в качестве каталога. Конечно, вам нужно создать каталог, если он не существует, и использовать тот же подход при извлечении файлов из кэша.

Для нескольких десятков тысяч достаточно 2 символа (256 подкаталогов от 00 до ff).

0 голосов
/ 29 июля 2009

Возможно, вы захотите рассмотреть memcached как альтернативу файловым системам. Использование памяти даст огромный прирост производительности.

http://php.net/memcache/

0 голосов
/ 29 июля 2009

Файловый ввод-вывод в целом относительно медленный. Если вы зацикливаете более 1000 файлов и записываете их на диск, медлительность может быть нормальной.

Я бы перенес это на ночную работу, если это приемлемый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...