Ambas funciones te sirven para checkear que exista un archivo. Sin embargo
file_exists devolverá
true tanto si le pasas por parámetro un archivo como un directorio, mientras que
is_file devolverá verdadero sólo si le pasas como parámetro un archivo (o eso entendí de
www.php.net). De todos modos, me parece que la diferencia es más conceptual... tienta clasificar a
is_file en el mismo conjunto que
is_number,
is_array, etc. Sin embargo sería un error, ya que en realidad
is_file no comprueba el tipo de dato (que tendría que ser
string), sino si éste representa un archivo válido en el servidor.
No estoy completamente convencido de todo lo que puse, pero me parece razonable. ¡Suerte!