Для начала - это НЕ функции. В документации PHP они называются "выражения".
Оба эти выражения выполняют одну и ту же функцию - подключает в генерируемую страницу заданный файл.
Разница между ними в самом процессе подключения.
include() добавляет код и тут же его исполняет. Если по какой-то причине подключаемый файл не будет найден, будет выдано предупреждение уровня WARNING, но сам скрипт продолжит работу.
require() сначала вставит код (до начала исполнения основного скрипта), а выполнит его только когда до него дойдёт. Если подключаемый файл не будет найден, возвращает ошибку FATAL ERROR и останавливает дальнейшую работу скрипта.
Исходя из этого, include() применяется тогда, когда отсутствие файла не сломает общую структуру сайта. Например, при подключении вывода какой-то локальной информации, рекламного баннера и т.д.
В то же время, require() используется когда подключаемый файл является критическим; например содержащим переменные конфигурации, без которых скрипт всё равно не будет работать.
Кроме этих выражений существуют ещё и выражения include_once() и require_once().
Они полностью идентичны основным, за исключением за исключением того, что проверяют был ли подключаемый файл уже включен ранее; и если да, не включают его снова.
Поэтому, такие выражения лучше использовать при подключении файла с большим количеством функций. Тогда можно быть точно уверенным, что файл не будет подключен многократно и не возникнет ошибка Duplicate function definitions.
Это необходимо, если дублированное подключение функции может вызывать ошибки, либо дополнительную задержку для повторной обработки подключаемого файла.
По отзывам программистов, выражение require() - предпочтительнее, так как оно работает немного быстрее. Выражения с _once более медленные. Поэтому, вместо их применения, желательно стараться писать код без возможного повторения функций.