Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Насколько быстра функция file_exists()?


Автор: Psytodelist 14.6.2011, 19:41
Здравствуйте! Хотелось бы узнать насколько быстра функция file_exists()
и как влияет на скорость её выполнения количество обрабатываемых ею
файлов в директории. Дело в том, что у меня есть скрипт загрузки
фотографий, а фотографии придается уникальный id md5(uniqid(rand(),1))
хотелось бы на всякий случай сделать проверочно-переименовательный цикл типа:

пока (файла с таким именем в директории есть) делай {
если (есть такой файл) {переименуй этот файл на id md5(uniqid(rand(),1))}
}

Насколько сильно повлияет на скорость выполнения скрипта подобная конструкция
при условии, что фотографий в директории относительно много?

Автор: solenko 14.6.2011, 21:08
Цитата(Psytodelist @  14.6.2011,  18:41 Найти цитируемый пост)
Хотелось бы узнать насколько быстра функция file_exists()

А померять религия не позволяет?

Цитата(Psytodelist @  14.6.2011,  18:41 Найти цитируемый пост)
и как влияет на скорость её выполнения количество обрабатываемых ею
файлов в директории.

плохо влияет. Насколько -- зависит от файловой систему (не уверен, что значительно)

Автор: Psytodelist 15.6.2011, 00:04
Цитата

А померять религия не позволяет?

Позволяет. А как это сделать, не подскажите?  smile 

Автор: Shogun 15.6.2011, 00:19
Цитата(Psytodelist @  15.6.2011,  00:04 Найти цитируемый пост)
Позволяет. А как это сделать, не подскажите?  smile  

Код

$start = microtime(true);

// Ваш код

echo microtime(true) - $start;


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

Автор: Psytodelist 15.6.2011, 07:00
Shogun, в очередной раз даёте дельные советы. С уважением.

Добавлено через 9 минут и 20 секунд
Shogun, а имеет ли смысл вообще делать подобную проверку в цикле, если я даю файлам
имя md5(uniqid(rand(),1)) и бросаю их в поддериктории, которые создаются относительно даты.
Все говорят: "Не мучайся, не думай.... вероятность повторов крайне мала". Все-равно
как-то 32 символа с расстановкой по 1234567890abcdef не на шутку дает усомнится в подобных советах.

Автор: s0lman 15.6.2011, 10:51
Цитата(Psytodelist @  14.6.2011,  19:41 Найти цитируемый пост)
есть скрипт загрузки
фотографий

Операция не настолько быстрая, чтобы проверка file_exists() ее существенно замедлила (если не 30 тыс файлов в 1 папке лежит)

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


Автор: Absinthe 15.6.2011, 12:06
Советую загружаемые фото раскладывать по разным каталогам(например на 256 на основе первых 2х символов хэша имени) т.к. наличие множества файлов в одном каталоге сильно замедляет работу всех популярных ФС.

Автор: Psytodelist 16.6.2011, 05:52
Цитата(s0lman @ 15.6.2011,  10:51)
Цитата(Psytodelist @  14.6.2011,  19:41 Найти цитируемый пост)
есть скрипт загрузки
фотографий

Операция не настолько быстрая, чтобы проверка file_exists() ее существенно замедлила (если не 30 тыс файлов в 1 папке лежит)

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

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

Автор: solenko 16.6.2011, 07:03
Цитата(Psytodelist @  16.6.2011,  04:52 Найти цитируемый пост)
Загрузка идет через аякс, который возвращается массив названий загруженных фото
и вставляет их в захайденый инпут. 

Т.е. клиент передумал, и мы получили подвисшие файлы, о которых нет никакой информации в системе. Как чистить -- хз... Не очень удахный вариант, как по мне

Автор: Shogun 16.6.2011, 11:55
Цитата(Psytodelist @  16.6.2011,  05:52 Найти цитируемый пост)
Нет, как раз работу с БД я решил избежать при загрузке фотографий.
Загрузка идет через аякс, который возвращается массив названий загруженных фото
и вставляет их в захайденый инпут. Во время выполнения заказа идет
внесение этого массива и информации о заказчике в БД.
Фотографии - в одну таблицу с уникальным ИД, а информацию о заказе в другую
с соответствующей ссылкой в виде уникального идентификатора массива фотографий, которые
были загружены перед отсылкой данного заказа. 

Ну так в чем собственно проблема? Для чего Вам нужен file_exists??

Если фотография попала в этот массив я так понимаю она загружена и нет смысла в file_exists.

Цитата(Psytodelist @  14.6.2011,  19:41 Найти цитируемый пост)
пока (файла с таким именем в директории есть) делай {
если (есть такой файл) {переименуй этот файл на id md5(uniqid(rand(),1))}
}

Зачем Вам переименовать файлы уже после того как они загружены а не сразу?
Код

$uploaded_images = array();
$new_filename = md5(uniqid(rand(),1));
if (is_uploaded_file($image['tmp_name'], $up_dir.$new_filename))
  {
    $uploaded_images[] = $new_filename;
  }
echo json_encode($uploaded_images);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)