getimagesize()関数を使った判別はよく使われてるようです。
でもこの関数、画像ファイルと認識できないと警告を出すので
@getimagesize()
のように関数頭に"@"を付加して警告が出るのを抑制するのが常套のようです。
この関数は画像かどうかの判別以外にも、縦横サイズその他の情報まで読み取っているので余分な処理の分だけ重くなります。
また、"@"演算子で警告抑制すると更に重くなるので画像判別だけのケースでは使わないことにします。
画像ファイルにはヘッダー部があり、決められたファイル構造(フォーマット)になっているのでこれで判別する方法です。
前出のexif_imagetype()関数も内部で同様の処理をしているという意味では同じ判別法になります。