dポイントプレゼントキャンペーン実施中!

検索したものに少し手を加えて、以下の関数を使って、URLを元にウェブページのタイトルを取得しています。

 function getPageTitle( $url ) {
  $html = file_get_contents($url);
  $enc_format = "JIS, eucjp-win, sjis-win, UTF-8";
  $html = mb_convert_encoding($html, "UTF-8", $enc_format);
  preg_match("/<title>(.*)<\/title>/is", $html, $retArr);
  return $retArr[1];
 }

しかし、ページによってはタイトルを取得するまでの時間が遅いです。おそらく、HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。今回はタイトルを取りたいだけなので、もっと早く処理ができてほしいです。何か方法はございますか?

A 回答 (2件)

まずは



$html = file_get_contents($url);



$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);

に変えるところからどうぞ。これだけでかなり速くなると思います。これで速度が足りなければ fopen で1行ずつ読み込んでいくことも検討しましょう。なお、提示された関数中の文字コードの羅列順序が不適切です(私もググって出てきたってことで以前はこれ使ってましたが、誤りです)。以下に正しい順番に直したサンプルを掲載しておきます。

function getPageTitle($url) {
  static $regex = '@<title>([^<]++)</title>@i';
  static $order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win';
  static $ch;
  if (!$ch) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  }
  curl_setopt($ch, CURLOPT_URL, $url);
  $html = mb_convert_encoding(curl_exec($ch), 'UTF-8', $order);
  return preg_match($regex, $html, $m) ? $m[1] : '';
}

また、そもそも遅い原因が「この関数の実行を繰り返している」ということであれば、今はオーダー表現で表せば O(n) 時間かかっていることになりますが、回線が許す限り O(1) の実行時間にする方法があります。これに該当する場合はその点の補足をお願いします。

この回答への補足

ご回答有難うございます!

一行ずつ読み取る考えは思い浮かびませんでした。<title></title>が一行に収まってることが前提じゃないと処理が少し複雑なるかも知れませんが。

適切なコードまで、載せていただき感謝しています。これから実行してみます!

補足日時:2014/08/06 16:17
    • good
    • 0
この回答へのお礼

何度も、試したところ、実用的な早さなので、使わせていただきます。ありがとうございました

お礼日時:2014/08/06 23:26

>HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。



それはhttpの仕組み上そういうものでは?
複数ページクロールするのならwgetあたりで非同期にバックグラウンド処理をさせるとか
タイトルを持ってくる部分をタイトルを抜くだけのPHPをajaxで走らせれば
速いところから順次うまっていくので、感覚的に速いと思えるようになるかもしれません。

また更新時間などを保存しておき、2回目以降の検索時にはヘッダ情報の日付けを
見るなりして、変更がなけば前回のデータを利用するなど
それなりの処理をすればある程度実用レベルのスピードになるのでは?

この回答への補足

そういった方法しかないのですか。今のところURLを先に表示しておいて、決まったら、URLをタイトルに書き直すようにはしてみましたが。

ブラウザだと、ページが完全に読み終わる前に、タイトルが表示されるので、何か方法があるかと思いました。

補足日時:2014/08/05 21:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!