効率的な方法でサイトのキーワード数を取得する方法

このQ&Aのポイント
  • サイトのキーワード数を効率的に取得する方法について教えてください。
  • 現在、キーワード数を取得するためにsearch.phpを使用していますが、対象サイトがPHPファイルの場合には表示までに時間がかかってしまいます。
  • キーワード数が増えると表示までの時間がさらに長くなってしまうため、より速く取得する方法を知りたいです。
回答を見る
  • ベストアンサー

ファイルの読み込みについて

こんばんは。今回は以前質問させて頂いた質問(http://oshiete1.goo.ne.jp/qa2425208.html)の延長線上にあると思いますがお許しねがいます。 あるサイトにあるいくつかの(ここでは5個とします)キーワードの数を調べて、更にそれに順位をつけたいのですが、以下のよな手順でやりたいと考えております。 (1)対象となるサイトから5個のキーワード(a,b,c,d,e)の数を導く -----------------seach.php------------------------------------- <?php $lines= file('対象サイトのURL'); $nn = count($lines); $key1 = 'a'; $key2 = 'b'; $key3 = 'c'; $key4 = 'd'; $key5 = 'e'; for ( $i=0; $i<=$nn; $i++ ){ $html = htmlspecialchars ($lines[$i]); $countA = $countA + substr_count($html, $key1); $countB = $countB+ substr_count($html, $key2); $countC = $countC + substr_count($html, $key3); $countD = $countD + substr_count($html, $key4); $countE = $countE + substr_count($html, $key5); } echo($countA); echo($countB); echo($countC); echo($countD); echo($countE); ?> 上のファイルを search.php とします。 (2)search.php を利用して5個のキーワードの数を数の多い順に並べる -------------------------------------------------------------- <?php ob_start(); include("search.php"); ob_clean(); print $search_value; $Count=array($countA,$countB,$countC,$countD,$countE); $Name=array("a","b","c","d","e"); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); for($i=0;$i<5;$i++){ print($Name[$i]); print($Count[$i]); } ?> とりあえず以上の方法で動作するのですが、対象サイトがPHPファイルだと実際に表示されるまで30分以上かかる場合もあります。まだキーワードの数が5個なのにこれだけ時間がかかるという事はキーワードの数が10個以上になったら更に表示されるまでの時間がかかってしまいますよね。 表示される時間をもっと速くさせる別の方法はございますでしょうか?アドバイスの程よろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

PHPでは、高速な関数、高速ではない関数があります。 パフォーマンスチューニングは、ボトルネックになっている箇所の特定をして、そこのコードを見直すようにしますので、 まずは、コードのどの処理に時間がかかっているのか確認するために、 要所要所に、通った時間をechoするようなデバッグコードを入れてみて、遅い部分の書き方を変えてみるのはいかがでしょうか。 (ひょっとしたら、キーワードの数よりも、対象サイト行数によって大幅に時間が違ってくるのかもしれません)

php1234
質問者

お礼

お返事ありがとうございます。頑張ってやってみます。ありがとうございました。

関連するQ&A

  • 順位を付ける時のスコアの重複について

    質問致します。例えばボーリングのスコアを順位をつけて並べたいのですが、参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=561384)を元に以下の様に書いてみました。 ---------------------------------------- <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); print("第1位:".$Count[0]." ".$Name[0]."<br>"); for($i=1;$i<count($Name);$i++){ if($Count[$i] != $Count[$i-1]){ print("第".($i+1)."位:".$Count[$i]." "); } print($Name[$i]."<br>"); } ?> ------------------------------------------------ しかしながら以上を実行してみますと順位の表示のされ方がうまくいきません。うまくいかない箇所はスコア(123)が3人並んだ場合に以下のようにしたいのですが、ならなくて苦闘しております。どのように書換えればよろしいのでしょうか。アドバイス頂ければと存じます。よろしくお願い致します。 第1位 202 Fさん 第2位 198 Bさん  第3位 123 Aさn 第3位 123 Cさn 第3位 123 Eさん 第6位 117 Dさん 

    • ベストアンサー
    • PHP
  • 順位のところを画像にする方法

    前回私がしました(http://oshiete1.goo.ne.jp/qa2429369.html)の質問に通ずるのですが、新たに質問させて頂きます。 例えばボーリングのスコアを順位をつけて並べたいのですが、 -------------------------------------- <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); $rank=-1; for($i=0;$i<count($Name);$i++){ if($Count[$rank] != $Count[$i]) $rank = $i; print("第".($rank + 1)."位:".$Count[$i]." ".$Name[$i]."\n"); } ?> 以上の順位の所を「○位」と書かれた画像にしたいのですが、以下のやり方でOKでしょうか?とりあえず表示されたのですが、もっと合理的な良い方法があるかと思いまして。 ---------------------------------------- 「第1位」と書かれた画像→0.gif 「第2位」と書かれた画像→1.gif 「第3位」と書かれた画像→2.gif ・      ・      ・ という風に上の画像を用意しておきます。そこで <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); $rank=-1; for($i=0;$i<count($Name);$i++){ if($Count[$rank] != $Count[$i]) $rank = $i; print("<img src='".$rank.".gif'>:".$Count[$i]." ".$Name[$i]."\n"); } ?> ------------------------------------------------------------ どなたか吟味の程よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPの参考書で分からないとこがあります

    PHPによるWebアプリケーションスーパーサンプル第2版のP.99のサンプルファイルにどうしても分からない箇所があります。 <html> <head> <title>絞込み検索キーワードをSQLに反映する</title> </head> <body> <?php // データを受け取る $text1 = @$_POST["text1"]; // SQL(ProductsテーブルからProductNameを抽出する) $sql = "SELECT ProductName FROM Products "; // キーワードが入力されているときはWHERE以下を組み立てる if (strlen($text1) > 0) { // 全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); // キーワードを空白で分割する $array = explode(" ", $text2); // 分割された個々のキーワードをSQLに反映する $where = "WHERE "; for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } } // 受け取った値を表示する echo "<p>検索キーワード:".$text1; // 組み立てたSQLを表示する echo "<p>組み立てたSQL:".$sql.@$where; ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1" value="<?php echo $text1?>"></td> <td><input type="submit" value="送信" name="sub1"></td> </tr> </table> </form> </body> </html> 上記の for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } の箇所なんですが、そこに複数ある「.(ドット)」は何を表しているのでしょうか? また、 if ($i < count($array) - 1) { $where .= " AND "; が行っている処理を教えて下さい。 初歩的な質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 検索時エラー

    はじめまして PHPを用いてsystem.csv内を検索するんですが、ある文字を入力すると Warning: eregi() [function.eregi]: REG_BADRPT と表示されてしまいます。 例えば: 藤、++ などです。 なぜでしょうか? またどのように修正してあげたらいいのでしょうか? よろしくお願いいたします。 <?php if($_GET["key"]==""){ print"キーワードを入力してくださいね"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); $Result=array(); $Data=file("system.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); if(eregi($KeyWord,$lines,$text_b)){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><?=$line[2]?><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } } ?>

    • 締切済み
    • PHP
  • flush()関数でページを徐々に表示する方法

    質問致します。PHPスクリプトを処理する際、全て処理し終わった後、いっきにページに表示されるのが普通だと思うのですが、これを段階的に表示したいのですが、それには出力バッファをオフにする。つまりflush()関数を使えばOKと聞きました。以下の例でいえば、どの場所にこのflush()関数を入れれば良いのでしょうか? <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"・・・この後1000件続く); $Count=array(123,198,123,117,123,202・・・この後1000件続く); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); print("第1位:".$Count[0]." ".$Name[0]."<br>"); for($i=1;$i<count($Name);$i++){ if($Count[$i] != $Count[$i-1]){ print("第".($i+1)."位:".$Count[$i]." "); } print($Name[$i]."<br>"); } ?> 以上のように1000件もの順位を表す為、徐々に表示したいというのが私のやりたい事です。 参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1248483)等を見たのですが、初心者な者で太刀打ちできないでおります。 具体的にflush()関数をここに入れるという風にご指摘頂ければ幸いでございます。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • CSVファイルの10件表示について

    PHP初心者です。 CSVデータを活用してサイトを作ろうとしているのですが、 フリーワードで検索すると下記のようなエラーが出てしまいます。 Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 77287300 bytes) in レンタルサーバー(ロリポップ)に memory_limitについて問い合わせたところ、 消費メモリを削減して対処してほしいと言われました。 10件だけ表示するようにすれば解決するかと思い、 自分なりにあれこれいじってみたのですが、 うまくいきませんでした。 10件だけ表示する方法やメモリ消費を抑える方法を お分かりになる方がいらっしゃいましたら、 ぜひご教授お願いいたします。 -index.php-トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> -seach.php-検索結果表示ページ <?php if($_GET["key"]==""){ print"キーワードを入力してください"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS"); $KeyWord=mb_convert_kana($KeyWord,s); $ArrKeyword=explode(" ",$KeyWord); $Result=array(); $Data=file("item.csv"); for($i=0;$i<sizeof($Result);$i++){ $lines=strip_tags($Data[$i]); $Match=true; for($n=0;$n<sizeof($ArrKeyword);$n++){ if(!eregi($ArrKeyword[$n],$lines)){ $Match=false; break; } } if($Match==true){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[3]?></a></li> <?php } } } ?> 下記の行がエラーのようです。 for($i=0;$i<sizeof($Result);$i++){

    • ベストアンサー
    • PHP
  • twitterAPIを利用してツイート一覧を取得

    <?php //twitteroauth.phpを読み込み require_once dirname(__FILE__) .'/twitteroauth.php'; //検索ワード配列 $keyword_list = array("OKWave","yahoo知恵袋"); //最大検索数 $countmax = 10; //twitterAppsで取得 $consumerKey = '*****'; $consumerSecret = '*****'; $accessToken = '*****'; $accessTokenSecret = '*****'; $to = new TwitterOAuth( $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret ); //Twitterで検索するワード //複数の場合はORかANDを使う $key = ""; $size = count($keyword_list); for($i=0;$i<$size;$i++){ $keyword = $keyword_list[$i]; $key .= $keyword; if($i<$size-1){ $key .= " AND "; } } //オプション設定 //countmaxは最大検索数 $options = array('q'=>$key,'count'=>$countmax,'lang'=>'ja'); //検索 $json = $to->OAuthRequest( 'https://api.twitter.com/1.1/search/tweets.json', 'GET', $options ); $jset = json_decode($json, true); //tweetidを取得 foreach ($jset['statuses'] as $result) { //ローマ字の名前 $screen_name = $result['user']['screen_name']; //ユーザーID(数字) $id = $result['user']['id']; //ユーザー名 $name = $result['user']['name']; //ユーザーアイコン画像URL $link = $result['user']['profile_image_url']; //該当ツイート $content = $result['text']; //更新日 $updated = $result['created_at']; $time = date("Y-m-d H:i:s",strtotime($updated)); //不明なものはprint_rで見ればいい //print_r($result); echo "<img src='".$link."''>"." | ".$screen_name." | ".$id." | ".$name." | ".$content." | ".$time." "; } ?> このコードで特定のワードを含んだツイートを取得して【並び替えてから】表示したいのですが、並び替えがうまくできません。 ランダムや新着順、リツイート順などで並び替えることは可能でしょうか。 可能であれば、並び替えの為に必要なコードを教えていただけませんか。

    • ベストアンサー
    • PHP
  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP
  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう