Подтвердить что ты не робот

Является ли file_exist() в PHP очень дорогостоящей операцией?

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

Я бы скорее пошел с методом file_exists() лично, так как это дает мне простой способ вернуться к аватару по умолчанию, если текущий не существует (пока) и его просто реализовать код мудрый. Тем не менее, я беспокоюсь о производительности, так как это будет выполняться один раз для каждого пользователя, показанного на странице pageload на страницах прочитанного форума. Итак, я хотел бы знать, действительно ли функция file_exists() в PHP вызывает серьезные замедления, которые могут привести к значительным результатам производительности в условиях высокого трафика?

Если нет, отлично. Если да, то каково ваше мнение об альтернативах для отслеживания загруженного пользователем изображения? Спасибо!

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

4b9b3361

Ответ 1

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

Однако, если вы уже читаете информацию о пользователе из базы данных, вы также можете хранить информацию там. Если пользователю разрешен только один аватар, вы можете просто сохранить один бит в столбце для "имеет аватар" (1/0), а затем иметь имя файла так же, как и идентификатор пользователя, и использовать что-то вроде SELECT CONCAT(IF(has_avatar, id, 'default'), '.png') AS avatar FROM users

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

Ответ 2

При фактическом тестировании производительности вы обнаружите, что file_exists будут очень быстрыми. Как и в php, когда один и тот же url является "stat" 'd дважды, второй вызов просто извлекается из внутреннего тайского кэша php.

И это только в области действия php. Даже между прогонами файловая система /os будет стремиться агрессивно помещать файл в кеш файловой системы, а если файл достаточно мал, то не только тест на наличие файла выходит из памяти, но и весь файл.

Вот некоторые реальные данные, чтобы поддержать мою теорию:

Я просто делал некоторые тесты производительности утилит командной строки linux "find" и "xargs". В выручке я выполнил тест на наличие файла по 13000 файлам, по 100 раз каждый, менее чем за 30 секунд, так что он усредняет 43 000 стат-тестов в секунду, поэтому, конечно, на мелкой шкале он медленный, если сравнивать его с временем, требуется разделить 9 на 8, но в сценарии реального мира вам нужно будет делать это очень много раз, чтобы увидеть заметную проблему с производительностью.

Если у вас есть 43 тысячи пользователей, одновременно обращающихся к вашей странице, в течение секунды, я думаю, что у вас будет гораздо больше проблем, чем время, затрачиваемое на копирование статуса существования файла. меньше объема памяти в среднем сценарии.

Ответ 3

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

  • один для каждого подкаталога веб-корня (для проверки существования и для символических ссылок)
  • один для проверки файла .htaccess для каждого подкаталога веб-корня
  • один для существования вашего script

Это не относится к тому, что PHP может сделать сам.

Ответ 4

По крайней мере, с PHP4, я обнаружил, что вызов file_exists определенно убивает наше приложение - оно было очень сильно заполнено в библиотеке, поэтому нам действительно нужно было использовать профилировщик, чтобы найти его. Удаление вызова увеличило количество вычислений на несколько страниц в десятки раз (вызов был сделан verrry повторно).

Возможно, что в PHP5 они кэшируют файлы file_exists, но по крайней мере с PHP4 это не так.

Теперь, если вы не в цикле, очевидно, что file_exists не будет большой проблемой.

Ответ 5

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

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

Ответ 6

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

В соответствии с "аватаром по умолчанию"... ну, если запись не найдена для этого пользователя, просто используйте по умолчанию.

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

Ответ 7

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

В конце концов, это просто поиск в каталоге с использованием системных вызовов. После первого выполнения script большая часть каталога релевантности будет кэшироваться в хранилище, поэтому задействовано очень мало фактического ввода-вывода, а "file_exists()" - такая общая операция, что он и базовые системные вызовы будут быть высоко оптимизированным на любой общей комбинации php/os.

Как отметил Иоанн II. Если дополнительные функциональные возможности и функции пользовательской функции являются приоритетными, тогда будет работать база данных.