Intereting Posts
Очистка HTML: удаление элемента условно на основе его атрибутов Codeigniter: вложение электронной почты последних сообщений электронной почты не очищается при отправке нескольких писем в цикле Symfony: Как заставить JMS Serializer работать со строгими типами? Удалите все, кроме букв из строки PHP. Самый простой способ создать / получить php_memcache.dll для PHP 5.4 Зависимые тесты между двумя классами TestCase в PHPUnit Мой композитор не будет полностью обновлять Laravel 4, он застрял с мастером В любом случае, чтобы определить, закрывает ли пользователь браузер с помощью php? Чтение почты в php с помощью imap Ограничение open_basedir Файл не находится в допустимом пути Различные стили CSS для последнего элемента php-массива Типы HTTP-аутентификации и как создать безопасную базу данных? В лаке не хватает кеша, куки? Laravel 4 Ошибка при миграции 1072 PHP короткий уникальный генерации идентификатора с использованием auto_increment?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это не рассматривает больше из них, что PHP может сделать сам.

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

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

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

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

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

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

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

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

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

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

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