Задать вопрос

Функция glob() в PHP?

Буквально недавно в проекте потребовалась функция поиска файлов по маске glob(). Но вот пока в раздумьях, стоит ли ее использовать, и насколько сильно она грузит сервер.


Задача такова:

Есть объект, предположим, автомобиль, у него есть 20-30 фотографий, которые складируются в 5 папок с разными размерами. Соответетсвенно при наличии в базе 20-30000 объектов фотографий может быть примерно около 150-200 000 файлов. Поиск по маске будет выполняться нечто типа такой: "/path/photos/[obj_id]_*.jpg" Так вот, что-то меня очень сильно смущает в использовании этой функции… И нигде не могу нарыть информацию о нагрузках.
  • Вопрос задан
  • 9413 просмотров
Подписаться 6 Оценить Комментировать
Решения вопроса 1
DevMan
@DevMan
Создаём 200к файлов:
#!/bin/bash

dir="/test"

ctr=1
range=30000
while [  ${ctr} -lt 200001 ]; do
	id=${RANDOM}
	let "id %= ${range}"
	`touch "${dir}/${id}_${ctr}.jpg"`
	let ctr=ctr+1 
done

Проверяем:
~> ./test_glob
~> ls -1 /test | wc -l
200000

Тестируем производительность:
<?php

$dir = '/test/';
$id = rand( 1, 30000 );
$pattern = $dir . $id . '_*.jpg';

$time_start = microtime(true);

$photos = glob( $pattern );

$time_end = microtime(true);
$time = $time_end - $time_start;

echo 'execution time is ', $time, ' seconds', PHP_EOL;

print_r($photos);

~> php ./test_glob.php 
execution time is 0.15708804130554 seconds
Array
(
    [0] => /test/23513_10050.jpg
    [1] => /test/23513_10631.jpg
    [2] => /test/23513_121888.jpg
    [3] => /test/23513_150044.jpg
    [4] => /test/23513_167985.jpg
    [5] => /test/23513_185798.jpg
    [6] => /test/23513_188480.jpg
    [7] => /test/23513_193143.jpg
    [8] => /test/23513_68603.jpg
)


Делаем выводы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Имхо, хранить 200 000 файлов в папке не самая лучшая идея. я бы сделал структуру папок вроде 12/34/56/78/90/*.jpg, где 1234567890 — obj_id. Хотя, конечно, сильно зависит от ФС и свободной памяти на сервере
Ответ написан
AndryX
@AndryX
Выполнять её будет накладно, но вы же можете это протестировать и самостоятельно (небольшой тест-скрипт). Лучше проиндексируйте текущие файлы в базу, а новые заносите туда сразу же, после добавления…
Ответ написан
Комментировать
burdakovd
@burdakovd
Не знаю, исправили ли уже, но habrahabr.ru/blogs/infosecurity/105894/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы