任意のURL(ファイルの種類は不明)からHTMLを取得するPHPプログラムを作成しています。
取得したいのはHTMLのみですが、ファイルの種類が分からないためHTML以外の巨大なファイルを読み込む可能性があります。
URLからcurl_execでファイルの内容を取得する際に、ファイルサイズが大きかった場合に以下のエラーでプログラムが落ちてしまいます。

Allowed memory size of *** bytes exhausted

プログラムの先頭にini_set("memory_limit", "-1");を追加しても駄目でした。
ファイルサイズがはかり知れないためこの方法による回避はやめたいです。

次に考えたのが、curl_execの前にヘッダーのみ取得してヘッダーからContent-Lengthを取得する方法ですが、Content-Lengthの記述があるとは限らないのでこの方法も駄目でした。

$header = @shell_exec("curl -I {$url}")

次に考えたのが、fopenでファイルの先頭だけ取得してHTMLかどうかを判別する方法です。

$fp= @fopen($url, "r", false, $context);
if ($fp) {
 $head = @fread($fp, 1000);
 fclose($fp);
}

if (preg_match("/^(<\!DOCTYPE|<html)/i", trim($head), $matches) > 0) {
 $html = curl_exec($url);
}

判別の仕方は良くないかも知れませんが、この方法ではある程度上手くいきました。
ただしヘッダー取得の方法やこの方法だと2度URLにアクセスするため、全体の処理に時間がかかってしまいます。
時間をかけずメモリエラーを出さずにHTMLを取得する方法はないでしょうか?