• ベストアンサー

PHPで<title>タグ取得の動作が非常に重い

PHPで<title>タグ取得の動作が非常に重い $html = file_get_contents($url); if(preg_match( "/<title>(.*?)<\/title>/i", $html, $match)) { } 上記のような方法で一度に(1ページ内で)30サイトほどの<title>タグを取得すると、不可がかかり、表示までにかなり時間がかかってしまいます。 preg_match では重いのでしょうか。 それとも一度に30サイトはそもそも無理があるのでしょうか。。

  • tkmkok
  • お礼率87% (128/146)
  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • tracer
  • ベストアンサー率41% (255/621)
回答No.2

取得先のコンテンツ、あるいはサーバー自体が重いとは考えられませんか?たとえば、preg_matchで検索せずに、そのまま読み込むのにどれくらい時間がかかりますか?また、titleタグはheadタグ内にあると決まっているので、バイト数などで読み込む量を制限するといくらかは軽くなるかもしれませんね。 取得先のコンテンツが重いのはどうにもなりませんが、PHPでなくJSの使用が可能であるならば、非同期で取得することで、体感としてはいくらか向上すると思います。

tkmkok
質問者

お礼

ありがとうございます。 preg_match部分を外して試しても、やはり変わらず重いままでした。 ↓そこで、ご指摘のバイト数を調整してみました。 $html = file_get_contents($url, NULL, NULL, 0, 1500); だいぶ軽くなりました。 今で普通に重いサイトだなぁ、くらいの体感です。。 後はAjaxにする方法しかないんでしょうかね。

その他の回答 (2)

  • tracer
  • ベストアンサー率41% (255/621)
回答No.3

No2です。 最新の情報を取得しなくてもよいのであれば、定期的(1時間おきくらい)にタイトルを取得するプログラムをつくって、その結果(CSVなど)を読み込むことで、毎回重いのは回避できると思います。いわゆるキャッシュファイルをつくって読み込むということですね。また、1時間おき程度の頻度なら、アクセス毎の取得よりも相手サイトに迷惑がかからないと思いますし、自分のサーバーの負荷も軽減できます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>preg_match では重いのでしょうか。 クロールの仕方がおかしいのでは? 処理自体はそれほどおそいことはないです

関連するQ&A

  • PHPでWebページの特定部を取得したいのですが、上手くいきません。

    PHPでWebページの特定部を取得したいのですが、上手くいきません。 現在file_get_contentsを用いてURLを指定して取得し、preg_matchの引数にする方法で行っています。 また、preg_matchは以下のように用いています。 preg_match("/パターン(.*?)パターン/s", $html, $matches); print_rで$matchesを表示してみたところArray()のみ出力されます。 また、話が逸れて申し訳ないですが、上記とは別にfile_get_contentsを用いて動的にURLを指定して取得しているのですが、処理に時間がかかります。(約10秒) $wordをURLに組み込む変数として以下のように記述しています。 file_get_contents("http://…".$word."…(URLの続き)"); 以上の2点についてご教示願います。

    • ベストアンサー
    • PHP
  • phpでhtmlのタイトルを取得する方法について

    phpを使い、URLで指定されたサイトのタイトルを取得したいと考えています。 以下の通り実装してみたのですが、特定のサイトで取得したタイトルが文字化けしてしまいます。 mb_internal_encoding("UTF-8"); $html = file_get_contents($url); $convertedHtml = mb_convert_encoding($html, 'UTF-8', 'auto'); if (preg_match('/<title>(.*)<\/title>/i', $convertedHtml, $matches)) { return $matches[1]; } ※$urlにはタイトルを取得したいサイトのURLが入っています ※例をあげると、"http://rental.geo-online.co.jp" を$urlにセットした場合にタイトルが文字化けします 文字化けしてしまったサイトの文字コードは、x-sjisやEUC-JPでした。 この場合、$htmlから文字コードを指定しているタグをを取得すれば良いのか、 とも考えましたが、HTMLの知識に乏しくどのように正規表現を書いたら良いのかがわかりません。 ちなみにphpのバージョンは5.3.2です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの正規表現でHTMLタグの内容を抽出したい

    jqueryでPHPにurlを渡して、そのurlの中のtitleタグの内容を抽出したいと思ってます。が、うまく行きません。 ●jquery↓ <script type="text/javascript"> function site_check(){ var url = $("#url0").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURI(url) ,function(res){ $("#title").html(res.title); }); } </script> ●test.php↓ $html=file_get_contents($_GET["url"]); preg_match_all("/<title>(.*?)<\/title>/i",$html,$html_title); header('Content-type: application/json'); echo json_encode($html_title); このコードではなにもレスポンスが帰って来ません。 もし足りない情報がありましたらご指摘ください。

    • ベストアンサー
    • PHP
  • PHPのタイトルの取得

    こちら(http://wsd.zombie.jp/gw/php_curl_file_get_contents/)のページとこちら(https://www.php.net/manual/ja/funct ion.file-get-contents.php)のページを参考に別ページからタイトルを取得したいと思っているのですが、できませんでした。(上記のサイト様では、ヤフーニュースの取得ができるらしいのですが、表示されませんでした。) webページのタイトルを取得したいです。 index.phpファイル <a href>="ここに下記タイトルを取得"</a> ーサーバー上の別ページー page1.php <title>練習</title> このようにしたいので教えてください。

    • ベストアンサー
    • PHP
  • サイト名を取得するPHP

    url.txtに http://test1.com http://test2.com http://test3.com : とあります。このURLのhtmlファイルから<title>サイト名</title>部分を抜き出し、 http://test1.com+サイト名1 http://test2.com+サイト名2 http://test3.com+サイト名3 : と表示したいです。 <?php /** * ページタイトルを取得する関数 */ function getPageTitle( $url ) { $html = file_get_contents($url); //(1) $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" ); //(2) if ( preg_match( "/<title>(.*?)<\/title>/i", $html, $matches) ) { //(3) return $matches[1]; } else { return false; } } $filename="url.txt"; $data=file_get_contents($filename); $array = split("\n",$data); foreach($array as $values){ echo $array."+".getPageTitle($array); } ?> ですがこのコードだと7行目あたりでエラーが出てしまいます。 どなたか解決策をご教示ください。どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • file_get_contents 画像直URL

    file_get_contents($url);した際、画像の直URLがあったら、画像をローカルに保存して、URLを書き換えたいのですが、どうやればいいでしょうか? if(preg_match("/http:\/\//", file_get_contents($url))) { ?? } また、画像をローカルに保存って、PHPで出来るのでしょうか?

    • ベストアンサー
    • PHP
  • PHP Webページのタイトルを取得したい

    検索したものに少し手を加えて、以下の関数を使って、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をすべて読み取るまで、終了しないため、遅くなるのだと思います。今回はタイトルを取りたいだけなので、もっと早く処理ができてほしいです。何か方法はございますか?

    • ベストアンサー
    • PHP
  • php4でxmlを取得してページに表示

    http://www.phppro.jp/school/mashup/vol3/2 を参考に以下コードを書いたのですが、記事を1件表示させるだけでなく別の記事も複数件表示させたい場合はどうすれば良いのでしょうか。 また、<dc:type>番付</dc:type>のものだけを抜き出す方法も教えていただけると嬉しいです。宜しくお願い致します。 <?php function news(){ //XMLデータ取得用ベースURL $req = "http://polls.dailynews.yahoo.co.jp/rss.xml"; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<item>.*?<title>(.*?)</title>.*?<link>(.*?)</link>.*?<description>(.*?)</description>.*?<dc:subject>.*?</dc:subject>.*?<dc:type>(.*?)</dc:type>.*?</item>@s', $buf, $match, PREG_SET_ORDER); $ret .= "<h1><a href=\"".$match[0][2]."\">".$match[0][1]."</a></h1>"; $ret .= "<div>".$match[0][3]."【".$match[0][4]."】</div>"; return $ret; } echo news(); ?>

    • ベストアンサー
    • PHP
  • HTMLをPHPでJSONにして返すには

    jqueryでurlをPHPに送って、そのurlのhtmlファイルから、titleタグやh1タグの内容を抽出し、連想配列に格納。そして、その連想配列をJSON形式にしてjqueryに返し、htmlにレンダリングしたいのですが上手くいきません。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function site_check(){ var url = $("#url").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURIComponent(url) ,function(res){ $("#title").html(res.title); $("#h1").html(res.h1); }); } </script> </head> <body> <div class="form"> URL <input type="text" id="url" value="" style="width:300px;" onfocus="this.select()" onkeypress="if(event.keyCode==13) site_check()" /> <button onclick="site_check()" />チェック</button> </div> title:<span id="title"></span></br> h1:<span id="h1"></span> </body> test.php↓ <?php $html=mb_convert_encoding(file_get_contents($_GET['url']), 'UTF-8', 'auto'); $array = array(); $pattern = "/(?<=<title>).+?(?=<\/title>)/mis"; preg_match($pattern,$html,$array['title']); $pattern = "/(?<=<h1>).+?(?=<\/h1>)/mis"; preg_match($pattern,$html,$array['h1']); header("Content-Type: application/json; charset=UTF-8"); echo json_encode($array); ?> このコードだと、test.phpからは、[object Object]と、レスポンスが返ってきてしまいます。

    • ベストアンサー
    • PHP
  • UTF-8サイトを取得しSJISに

    以下のPHPで指定のサイトを取得すると文字化けしてしまいます。 何処が悪いのか分かる方、ご指導お願い致します。 <?php $str = file_get_contents('http://esthe-cinderellaesthe.on.omisenomikata.jp/diary'); mb_convert_encoding($str,"SJIS","UTF-8"); if (preg_match('!<div id="content">(.*?)<div class="pr">!s', $str, $res)){ print $res[1]; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう