Я добавляю аватары к движку форума, который я разрабатываю, и я обсуждаю, делать ли что-то простое (изображение форума называется .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 () в процессе показа вашей веб-страницы, еще один запуск вашего сценария, вероятно, не окажет заметного влияния. Веб-сервер, скорее всего, сделает:
Это не рассматривает больше из них, что PHP может сделать сам.
По крайней мере, с PHP4, я обнаружил, что вызов file_exists определенно убивает наше приложение – оно было очень сильно заполнено в библиотеке, поэтому нам действительно нужно было использовать профилировщик, чтобы найти его. Удаление вызова увеличило количество вычислений на несколько страниц в десятки раз (звонок был сделан verrry повторно).
Возможно, в PHP5 они кэшируют файлы file_exists, но, по крайней мере, с PHP4 это не так.
Теперь, если вы не в цикле, очевидно, что file_exists не будет большой проблемой.
file_exists () не является медленным как таковым. Реальная проблема заключается в том, как настроена ваша система и где узкие места производительности. Помните, что в базах данных тоже нужно хранить вещи на диске, поэтому в любом случае вы потенциально сталкиваетесь с дисковой активностью. С другой стороны, как базы данных, так и файловые системы обычно имеют некоторую форму прозрачного кэширования для оптимизации повторного доступа.
Вы можете легко пойти в любом случае, так как вероятность того, что ваше узкое место в производительности будет в другом месте. Единственное место, где я могу видеть, что это очевидный выбор, было бы, если бы вы использовали какой-то перепроданный общий хостинг, где есть тонна дискового конфликта, но, возможно, доступ к базе данных находится в отдельном кластере и быстрее (или наоборот).
В прошлом я сохранил метаданные изображения в базе данных (включая ее имя), чтобы мы могли генерировать полезную статистику. Что еще более важно, сохранение данных изображения (а не самого файла, только метаданных) способствует изменению . Что делать, если в будущем вам нужно «одобрить» изображение, или вы хотите удалить его, не удаляя файл?
В соответствии с «аватаром по умолчанию» … ну, если запись не найдена для этого пользователя, просто используйте значение по умолчанию.
В любом случае, file_exists () или db, это не должно быть большим препятствием для беспокойства. Однако одно решение гораздо более расширяемо.
Если производительность – ваше единственное соображение, файл_exists () будет намного дешевле, чем поиск базы данных.
В конце концов, это просто поиск в каталоге с использованием системных вызовов. После первого выполнения скрипта большая часть каталога с релевантными адресами будет кэшироваться в хранилище, поэтому задействовано очень мало фактического ввода-вывода, а «file_exists ()» – такая общая операция, что он и базовые системные вызовы будут очень оптимизированы для любой общей комбинации php / os.
Как отметил Иоанн II. Если дополнительные функциональные возможности и пользовательские функции являются приоритетными, тогда база данных будет идти по пути.