file_exists () является слишком медленным в PHP. Кто-либо может предложить более быструю альтернативу?

Вы могли бы посмотреть" Эффективно Перечисление Подмножеств Набора ", который описывает алгоритм, чтобы внести свой вклад того, что Вы хотите - быстро генерируют все подмножества символов N от длины x к y. Это содержит реализацию в C.

Для каждого подмножества, необходимо было бы все еще генерировать все перестановки. Например, если бы Вы хотели 3 символа от "abcde", этот алгоритм дал бы Вам "abc", "abd", "abe"..., но необходимо будет переставить каждого для получения "acb", "баккара", "bca", и т.д.

34
задан Rik Heywood 10 November 2009 в 15:23
поделиться

11 ответов

file_exists() should be a very inexpensive operation. Note too that file_exists builds its own cache to help with performance.

See: http://php.net/manual/en/function.file-exists.php

27
ответ дан 27 November 2019 в 16:12
поделиться

What about glob()? But I'm not sure if it's fast.

http://www.php.net/manual/en/function.glob.php

0
ответ дан 27 November 2019 в 16:12
поделиться

Я даже не уверен, будет ли это быстрее, но похоже, что вы все еще хотели бы провести сравнительный анализ:

Создайте кэш большого массива всех путей к изображениям.

$array = array('/path/to/file.jpg' => true, '/path/to/file2.gif' => true);

Обновляйте кэш ежечасно или ежедневно в зависимости от ваших требований. Вы могли бы сделать это, используя cron для запуска PHP-скрипта, который будет рекурсивно проходить через каталог файлов для генерации массива путей.

Если вы хотите проверить, существует ли файл, загрузите кэшированный массив и выполните простую isset () проверку для быстрого поиска индекса массива:

if (isset($myCachedArray[$imgpath])) {
    // handle display
}

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

-1
ответ дан 27 November 2019 в 16:12
поделиться

Я считаю, что 1/2 мс на звонок очень и очень доступный. Я не думаю, что есть намного более быстрые альтернативы, поскольку файловые функции очень близки к нижним уровням, которые обрабатывают файловые операции.

Однако вы можете написать оболочку для file_exists (), которая кэширует результаты в кэш памяти или подобное средство. Это должно практически сократить время повседневного использования.

0
ответ дан 27 November 2019 в 16:12
поделиться

Если вы проверяете только существующие файлы , используйте is_file () . file_exists () проверяет существующий файл ИЛИ каталог, так что, возможно, is_file () может быть немного быстрее.

2
ответ дан 27 November 2019 в 16:12
поделиться

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

filename.jpg -> 012345 -> /01/23/45.jpg

Кроме того, вы можете используйте mod_rewrite, чтобы вернуть изображение-заполнитель для запросов к каталогу изображений, который 404.

3
ответ дан 27 November 2019 в 16:12
поделиться

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.

3
ответ дан 27 November 2019 в 16:12
поделиться

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.

21
ответ дан 27 November 2019 в 16:12
поделиться

Мы возвращаемся к фиктивному образу, если файл отсутствовал

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

Таким образом, у вас будут лишь небольшие накладные расходы на перенаправление и незаметная задержка на стороне клиента. По крайней мере, вы избавитесь от «дорогостоящего» (а я знаю, что это не так) вызова file_exists .

Просто мысль.

11
ответ дан 27 November 2019 в 16:12
поделиться

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.

1
ответ дан 27 November 2019 в 16:12
поделиться

Я точно не знаю, что вы хотите сделать, но вы можете просто позволить клиенту сделать это .

2
ответ дан 27 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

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