насколько быстро срабатывает mkdir

baziak3

Новичок
насколько быстро срабатывает mkdir

Создаю папку (mkdir) и сразу после этого начинаю в этой новой папке создавать файлы (fopen)...
Возможна ли под виндой (FAT32 или NTFS) ситуация, когда папка не станет доступна для создания в ней файлов моментально? Например, если в главной папке, в которой я создаю подпапку уже существует МНОГО (1000, 10000, ...) файлов?
 

LeFF®

Новичок
можно проверять папку на существование перед созданием файла
 

baziak3

Новичок
Интересует теоретически - появляется ли задержка с увеличением вложеных директорий и файлов, и если да то какое количство файлов критично (+/-)

-~{}~ 14.05.08 12:42:

LeFF®
функция mkdir возвращает true или false - если я получил true то это значит что:
а) директория успешно создана?
ИЛИ
б) директория успешно "поставлена в очередь" для создания?

Допустим я получил true от mkdir а затем проверяя папку на наличие получил false - какие мои действия? Ждать в цикле? Или выводить сообщение об ошибке? Если ждать то сколько?
 

Gas

может по одной?
появляется ли задержка с увеличением вложеных директорий и файлов, и если да то какое количство файлов критично (+/-)
так вложенных или на одном уровне? вообще всё зависит от типа файловой системы.
Даже если директория не создана физически, а поставлена в очередь, то логика подсказывает, что создаваемые файлы тоже будут поставлены в очередь и всё запишется нормально.
Если волнует скорость операций с директорией в которой больше N файлов на одном уровне, создавай в ней поддректории по какому-то принципу и в них распихивай эту кучу файлов/директорий.
 

baziak3

Новичок
Gas
структура директорий такая:

TMP/
-- SUB0001/
-- SUB0002/
...
-- SUBNNNN/

когда создается очередная директория SUBNNNN, в нее тут же надо сложить пачку файлов.

Волнует не скорость соднания папок/файлов а будут ли они вообще созданы. ВСЕГДА ли достаточно написать...

PHP:
if (@mkdir($path)) {
    $fp=fopen($path.$file,'w');
    fclose($fp);
    echo 'Success';
} else {
    echo 'Failed';
}
...что бы знать и расчитывать что все создано (кроме форс-мажора в виде перегрузки сервера и т.п.).
 

Gas

может по одной?
я бы голову не забивал, а так и сделал.
только выкинуть собаку и проверять результат fopen/fwrite тоже нужно, а то echo success, но файл не записался.
 

slach

Новичок
операция mkdir также как и rename обычно является "атомарной" на уровне файловой системы испоьзуемой OS
поэтому никакой "поставлено в очередь на создание" быть не может
 

baziak3

Новичок
HraKK
На какой файловой системе? За каким количеством может начинаться "критично"?

-~{}~ 14.05.08 16:42:

Gas
я бы тоже с удовольствием не забивал голову (и собственно не забивал изначально) но вот беда - с ростом количества папок перестает работать система :( При чем "рост количества папок" это пальцем в небо, наугад, больше никакой зависимости не нахожу.

-~{}~ 14.05.08 16:43:

slach
Почему же не может? В "очередь" может ставить сама OS.
 

slach

Новичок
baziak3
еще раз
Создание/удаление/переименования файлов, каталогов - это атомарные операции, не допускающие промежуточных состояний, по крайней мере для NTFS и ext2\ext3
повторю
никакой "постановки в очередь на создание каталога" в нормальных файловых системах нет
в какой нибудь GlusterFS может и есть, а в NTFS, ext2\ext3 НЕТ

единственные ЗАДЕРЖКИ связаны с КОЛИЧЕСТВОМ записей в списке элементов (файлов и каталогов) в какой либо директории, но эти вещи современные OS достаточно хорошо научились кешировать

"система перестает работать" это ДИАГНОЗ
что означате "перестает работать"? ошибки выдает??
каталог не создает?? или чего???
кусок кода приведи?
текст warning'а который на файловой операции ругается
и укажи при каком кол-ве записей в каталоге это происходит
 

baziak3

Новичок
slach
Проект лежит на закрытом сервере к которому прямого доступа нет. Поэтому на многие вопросы я пока не знаю ответ сам, сижу жду в онлайне ответсвенного человека который сможет ответить.

На настоящий момент известно следующее: система Windows, нагрузка достаточно высокая (~10000 в сутки). Что хочу узнать - точную версию, файловую систему, апач или иис. Еще конечно очень хочу ФТП.

> "система перестает работать" это ДИАГНОЗ
Сори, звучит загадочно.

Стояла задача - поиск. Т.к. за один раз может быть найдено достаточно много строк (1000-10000) решено было кешировать результат на диск что бы при перелистывании страниц не грузить БД.

Алгоритм следующий:

1. пользователь делает запрос

2. скрипт удаляет кеш старше 24 часов, затем проверяет, существует ли заданый запрос в кеше, если да - то выводит результат, если же нет то см. п 3.

3. скрипт ищет и
а) в папке tmp/ создает подпапку со случайным именем, это имя и параметры запроса которые ввел пользователь записываются в БД
б) во вновь созданной папке создаются файлы, 1 файл на каждое совпадение

4. после этого скрипт делает редирект на себя же и см. п 2.

По идее после первого же редиректа кеш должен быть создан. Если же по каким-то причинам кеш не создался идет попытка номер два и снова редирект. Затем, если снова неудача - попытка номер три.

Так вот, "система перестает работать" это значит что скрипт сделал 3 попытки а кеш так и не появился.

На локальной системе, разумеется, все работает на ура, даже при выполнении 100 запросов на поиск одновременно.

Больше информации пока не имею, как сказал жду ответсвенное лицо которое расскажет как и что или же даст наконец доступ к серверу. Возможно, имеющаяся информация позволит предположить что-нибудь еще?
 

slach

Новичок
ну скорее всего у тебя проблема с записью времени модификации и проверки инвалидированности кеша
ну например изза неучитывания timezone
у тебя file_mtime() для проверки инвалидации кеша используется???
ну сразу после mkdir создания сделай var_dump(file_mtime('/tmp/твоя_папка'));
погляди что выйдет

еще например у тебя кеш создается
но во время редиректа тупо удаляется

IMHO алгоритм неправильный
надо проверять
1) кеш есть?? берем данные из кеша без редиректа, ну или echo какое нибудь в коде поставь чтобы проверяло
2) кеш старый? удаляем кеш (после вывода)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
baziak3

нагрузка достаточно высокая (~10000 в сутки)
Так с математикой в школе было?
Посчитай количество запросов, пусть даже 10000 в час.
Выходит 10000/3600=2,7777777777777777777777777777778
запросов в секунду.
Это совсем НЕвысокая нагрузка.

И вообще хватит гадать на манной гуще.
установи xDebug и выясни на каких участках у тебя тормоза.
 

baziak3

Новичок
slach
Вообще прямо сейчас не имеет большого значения устаревший кеш или нет - его просто нет никакого. Все работает корректно после старта но перестает работать через 1-2 дня - что-то накапливается (папки/файлы?) и каким-то образом мешает работать дальше.

Но. Что бы отслеживать устаревший кеш я использую не file_mtime а просто при создании папки с кешем я записываю в БД вместе с именем папки текущий таймштамп. По нему и определяю, устарел кеш или нет (через 86400 секунд) - меня не волнуют ни timezone, ни что-нибудь еще. Помоему, таким образом исключается возможность удаления кеша сразу после редиректа.

Что касается алгоритма - я сознательно удаляю устаревший кеш перед выводом, т.к. зачем же показывать старые данные? Лучше поищем снова. Но опять-таки, как бы там ни было идиологически более правильно - это вроде бы не должно вести к описаной проблеме.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
ТС - ответ ты получил в самом первом посте.
Четкий и ясный.

-~{}~ 14.05.08 17:12:

что-то накапливается (папки/файлы?) и каким-то образом мешает работать дальше
Скажи, пожалуйста, более точнее относительно твоих слов "что-то".
 

baziak3

Новичок
Mr_Max
Дебагер мне не поможет т.к. проблема плавающая. Кроме того, речь не о тормозах а о том что поиск (вероятнее всего та часть в которой происходит создание папки/файлов)перестает корректно работать с течением времени. Что касается гадания - ты конечно прав, занимаюсь изучением проблемы дальше, очевидно что с подобной проблемой здешние завсегдатаи не сталкивались.

-~{}~ 14.05.08 18:18:

Mr_Max
> Скажи, пожалуйста, более точнее относительно твоих слов "что-то".

Я имею ввиду папки и файлы кеша (см. мои предыдущие посты).

-~{}~ 14.05.08 18:52:

slach
по поводу "постановки" и "не постановки" в очередь. Скажи, если допустим на то что бы создать директорию OS необходимо 5 секунд, то мой скрипт получит управление из ф-ии mkdir через 5 секунд (как только OS закочит свои дела), или же немедленно, как только в OS будет отправлен запрос на создание директории?

Если управление будет возвращено немедленно, значит true, вернувшееся из ф-ии mkdir вовсе не означает что директория уже существует... Возможна ли в NTFS (или же FAT32) ситуация, когда результатом кода...

PHP:
if (mkdir($path)) {
    echo 'Created.';
}
if (!file_exists($path)) {
    echo ' Not exists.';
}
...будет "Created. Not exists"?

-~{}~ 15.05.08 11:51:

Проблема решена, дело было в том что имя папки с 32-ух символьным ключом не достаточно уникальное - после 10000 ключи начинают безбожно повторяться. Вот вам и random...
 
Сверху