Вы могли бы посмотреть" Эффективно Перечисление Подмножеств Набора ", который описывает алгоритм, чтобы внести свой вклад того, что Вы хотите - быстро генерируют все подмножества символов N от длины x к y. Это содержит реализацию в C.
Для каждого подмножества, необходимо было бы все еще генерировать все перестановки. Например, если бы Вы хотели 3 символа от "abcde", этот алгоритм дал бы Вам "abc", "abd", "abe"..., но необходимо будет переставить каждого для получения "acb", "баккара", "bca", и т.д.
file_exists()
should be a very inexpensive operation. Note too that file_exists
builds its own cache to help with performance.
Я даже не уверен, будет ли это быстрее, но похоже, что вы все еще хотели бы провести сравнительный анализ:
Создайте кэш большого массива всех путей к изображениям.
$array = array('/path/to/file.jpg' => true, '/path/to/file2.gif' => true);
Обновляйте кэш ежечасно или ежедневно в зависимости от ваших требований. Вы могли бы сделать это, используя cron для запуска PHP-скрипта, который будет рекурсивно проходить через каталог файлов для генерации массива путей.
Если вы хотите проверить, существует ли файл, загрузите кэшированный массив и выполните простую isset () проверку для быстрого поиска индекса массива:
if (isset($myCachedArray[$imgpath])) {
// handle display
}
По-прежнему будут накладные расходы на загрузку кеша, но, надеюсь, он будет достаточно небольшим, чтобы оставаться в памяти.
Я считаю, что 1/2 мс на звонок очень и очень доступный. Я не думаю, что есть намного более быстрые альтернативы, поскольку файловые функции очень близки к нижним уровням, которые обрабатывают файловые операции.
Однако вы можете написать оболочку для file_exists (), которая кэширует результаты в кэш памяти или подобное средство. Это должно практически сократить время повседневного использования.
Если вы проверяете только существующие файлы
, используйте is_file ()
.
file_exists ()
проверяет существующий файл ИЛИ каталог, так что, возможно, is_file ()
может быть немного быстрее.
Создайте процедуру хеширования для разбиения файлов на несколько подкаталогов.
filename.jpg -> 012345 -> /01/23/45.jpg
Кроме того, вы можете используйте mod_rewrite, чтобы вернуть изображение-заполнитель для запросов к каталогу изображений, который 404.
file_exists()
is automatically cached by PHP. I don't think you'll find a faster function in PHP to check the existence of a file.
See this thread.
Use absolute paths! Depending on your include_path
setting PHP checks all(!) these dirs if you check relative file paths! You might unset include_path
temporarily before checking the existence.
realpath()
does the same but I don't know if it is faster.
But file access I/O is always slow. A hard disk access IS slower than calculating something in the processor, normally.
Мы возвращаемся к фиктивному образу, если файл отсутствовал
Если вы просто хотите вернуться к этому фиктивному образу, вы можете разрешить клиенту провести переговоры с сервер с помощью перенаправления (к фиктивному образу) на файл-не-найден.
Таким образом, у вас будут лишь небольшие накладные расходы на перенаправление и незаметная задержка на стороне клиента. По крайней мере, вы избавитесь от «дорогостоящего» (а я знаю, что это не так) вызова file_exists
.
Просто мысль.
Are they all in the same directory? If so it may be worth getting the list of files and storing them in a hash and comparing against that rather than all the file_exists lookups.
Я точно не знаю, что вы хотите сделать, но вы можете просто позволить клиенту сделать это .