![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
検索したものに少し手を加えて、以下の関数を使って、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をすべて読み取るまで、終了しないため、遅くなるのだと思います。今回はタイトルを取りたいだけなので、もっと早く処理ができてほしいです。何か方法はございますか?
No.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>が一行に収まってることが前提じゃないと処理が少し複雑なるかも知れませんが。
適切なコードまで、載せていただき感謝しています。これから実行してみます!
No.1
- 回答日時:
>HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。
それはhttpの仕組み上そういうものでは?
複数ページクロールするのならwgetあたりで非同期にバックグラウンド処理をさせるとか
タイトルを持ってくる部分をタイトルを抜くだけのPHPをajaxで走らせれば
速いところから順次うまっていくので、感覚的に速いと思えるようになるかもしれません。
また更新時間などを保存しておき、2回目以降の検索時にはヘッダ情報の日付けを
見るなりして、変更がなけば前回のデータを利用するなど
それなりの処理をすればある程度実用レベルのスピードになるのでは?
この回答への補足
そういった方法しかないのですか。今のところURLを先に表示しておいて、決まったら、URLをタイトルに書き直すようにはしてみましたが。
ブラウザだと、ページが完全に読み終わる前に、タイトルが表示されるので、何か方法があるかと思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- HTML・CSS CSSが上手く反映されないみたいです 2 2022/11/21 16:19
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Nvuで作成したhtmlをコピペして...
-
URLの結合
-
JSFタグのfタグとは
-
htmlタグ間の特定文字置換
-
こんにちは。PHPとMySQLで自作...
-
ソースコードの1行が長いとき...
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
全角括弧と全角読点の間隔を狭...
-
文字の入力で横バー上段、中断...
-
エクセルのCOUNTIFが正しくカウ...
-
メッセージボックスで1025文字...
-
記号は半角と全角どちらがよい...
-
文字化け変換方法
-
コンボボックスの項目中に改行を
-
16進数の文字列をアスキーコー...
-
Excel関数「COUNTIF」で”文字”...
-
ラベル(スタティックテキスト)...
-
PHPmailerでの添付ファイルの文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[php][正規表現]タグ以外を削除...
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
phpの正規表現でstyle="●●"を削...
-
正規表現でタグの置換をしたい...
-
コメントタグに挟まれた部分を...
-
Nvuで作成したhtmlをコピペして...
-
タグにはさまれている文字以外...
-
htmlタグ間の特定文字置換
-
htmlのソースからテーブルの値...
-
スクレイピングの仕方
-
Java正規表現-"ある文字列"を含...
-
JSFタグのfタグとは
-
htmlソースの中を検索して、
-
PHP 取得した経過時間の表示に...
-
eclipseより、タスク・タグの使...
-
タグとクッキーって関係あるん...
-
srcに「banner.」で始まるファ...
-
htmlspecialchars関数を使いな...
-
アクセス解析データがでません...
おすすめ情報