phpの処理速度とmysqlについて

このQ&Aのポイント
  • phpの処理速度とmysqlについて
  • httpリクエストをしているので、ある程度かかっても仕方ないと思っているのですが、大体どれくらいなのか気になった次第です。後、1つのファイルで下くらいのmysql処理は別に多くないですよね?
  • mysqlから特定のキーワードを取得し、それを基にhttpリクエストを送り、取得した内容を一部mysqlに保存・更新する処理です。処理速度については、6.343くらいかかっているようです。
回答を見る
  • ベストアンサー

phpの処理速度とmysqlについて

以下のような処理をphpで実行してmicrotimeでみたところ、 6.343くらいなのですが、これって遅いでしょうか? httpリクエストをしているので、ある程度かかっても仕方ないと思っているのですが、 大体どれくらいなのか気になった次第です。後、1つのファイルで下くらいのmysql処理は別に多くないですよね? 恐れ入りますが、ご回答お願い申し上げます。 以下ソースです。 ■実行内容 mysqlから特定のキーワード取得(最後に更新した日から古い順に取得) ↓ そのキーワードを基にhttp://goodkeyword.net/へリクエストを送る。 ↓ file_get_htmlで内容を取得後、一部mysqlへ保存、更新。 ※処理はcronで実施 table構成 ■keywordsテーブル id, name(検索用キーワード) search_date(最後に処理を実行した時間) flg(defaultは1、更新や処理完了後2に変更) ■result_keywordsテーブル keyword_id(外部キー) word(取得ワード) ----------------------------------------------------------------- require_once 'conn.php'; require_once 'simple_html_dom.php'; $start = microtime( TRUE ); $req = $db->prepare('select * from keywords order by search_date asc limit 3'); $req->execute(); $words = $req->fetchAll(); foreach ($words as $word) { $url = 'http://goodkeyword.net/search.php?formquery=' .$word['name']. ''; $html = file_get_html($url); $src = $html->find('#column3-yahoo-result .result-keyword-detail tr td[!class]'); foreach($src as $element) { $rem = strip_tags($element);     if($word['flg'] == 1) { //table result_keywordsへのinsert処理(取得キーワードの挿入) } else { //table result_keywordsへのupdate処理(取得キーワードの更新) } //table keywordsへのupdate処理(search_date変更) } //table keywordsへのupdate処理(フラグ変更) } echo microtime( TRUE ) - $start; $html->clear();

  • PHP
  • 回答数4
  • ありがとう数3

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

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

>また、一度に5万件リクエストを送る訳でなく、 >1時間に30~40回リクエストで考えております。 >時間はかかりますが、相手側を考えますとこれくらいなら大丈夫かなと >思っておりますが、いかがでしょうか? まぁそのくらいのリクエスト数であれば特段目に余ることはないと思いますが 逆に1時間に多少多目にみて60回のリクエスト(1分に1リクエスト)だとしても 5万件処理するのに1月以上かかりますが、それでよろしいのですか? また長期間にわたりあまり頻繁にアクセスすると、結局攻撃者とみなされて、 レスポンスを拒否されたり、処理順をおとされたりするかもしれません。 ということで同サイトの処理能力からみておそらく実用に堪えないかと

04106972
質問者

お礼

時間がかかってしまうのはいた仕方がないと思っております。 結局は、相手側の処理能力の問題で大きなトラフィックをさばいているサイトでしたら、そんなに問題はないということでよろしいでしょうか? また、追加になりますが、疑問がありますので質問させてください。 クロールしてくるのに、wget,Pavuk,cURLなどがあると思いますが、これらのコマンドは丸々取得はできますが、例えばあるサイトの画像のパスや特定のタグの中のテキストを抽出するといった、加工が必要になってくると上記コマンドでは困難ですよね?(grep,正規表現は使えばできなくないと思いますが) もし、困難だとすると、あるサイトの画像のパスや特定のタグの中のテキストを抽出する場合は、wgetなどのコマンドを使用するより、file_get_htmlなどの方が作業的には楽になると思うのですが、認識はあっていますでしょうか? また、wgetやfile_get_htmlなどで相手側に与える負荷の差は特にないと思っているのですが、どうなんでしょうか? 恐れ入りますが、ご回答宜しくお願い申し上げます。 また、ご回答いただきました後、ベストアンサーとさせていただきます。

その他の回答 (3)

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

>相手側の処理能力の問題で大きなトラフィックをさばいているサイトでしたら、 >そんなに問題はないということでよろしいでしょうか? 一言でいえば運用者が恣意的にNGといえば利用者は有償の責任を負うということです 前述した岡崎市立中央図書館事件では1時間に400リクエストでオーバーフロー する仕組みに対して1秒以上猶予をおいてリクエストを投げ続けたことで 問題となったようです。 https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6 問題ないかどうかは、運用者と司法が判断することなので、なんとも言えませんが 前例から見ておそらく有罪にはならないと思いますが20日程度の拘留の可能性は否定できません。 また損害が発生すればその賠償責任もでてくる可能性があります。 >wgetなどのコマンドを使用するより、file_get_htmlなどの方が作業的には楽になる phpで非同期処理を模索するくらいなら 個人的にはwgetをバックグラウンドで処理する方が楽だと思いますよ ファイルに落としたものを評価すればいいだけなので >wgetやfile_get_htmlなどで相手側に与える負荷の差は特にない これは大差ないと思います

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

ああ、例の5万件の続きですか・・・ 1リクエストが秒単位でのレスポンスでは5万件の処理は無理ですね もしサーバー過負荷だとしたら業務妨害で訴えられるレベルの作業かも (岡崎市立中央図書館事件てきな・・) もしサーバーに負荷をかけて問題ないなら、wgetなどのクローラーを 裏でまわして非同期処理する必要があるかも

04106972
質問者

お礼

改めまして、ご回答ありがとうございます。 先ほど、ループで三度リクエスト送ってみましたが、 chromeのtimingで確認しましたところ以下のようになりました。 sending: 0ms waiting: 2.9s receiving: 1ms これでも、問題ございますか? どの程度が好ましいのかわからず困惑しております。 また、一度に5万件リクエストを送る訳でなく、 1時間に30~40回リクエストで考えております。 時間はかかりますが、相手側を考えますとこれくらいなら大丈夫かなと 思っておりますが、いかがでしょうか?

noname#244856
noname#244856
回答No.1

処理時間短縮への工夫 ○ HTTPリクエストを並列にする [PHP] cURLマルチリクエスト用簡易ラッパー http://bloggdgd.blog28.fc2.com/blog-entry-290.html こちらのラッパークラスをご利用ください。 MultiRequest::get(array($url1, $url2, $url3)); といった使い方が出来ます。なお、cURLオプションで curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); を指定するとgzip圧縮されるのでさらに高速化できそうです。 ○ プリペアドステートメントを使いまわす ループ中で同じものを何回もprepareしている場所があれば、ループの外でそれを行ってキープして使い続けましょう。PDOはキャッシュを利かせた場合に2回目以降の処理速度が劇的に向上します。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71

04106972
質問者

お礼

ご回答ありがとうございます。 >○ HTTPリクエストを並列にする やはり、並列でやるのがベストっぽいですね。 参考にさせていただきます。 >○ プリペアドステートメントを使いまわす 同じ物のprepareじゃない場合はループの外でキープしても無意味ですよね? こちらも情報ありがとうございます。

関連するQ&A

  • php+mysqlでand検索

    ソースコード抜粋 下記のコードを見つけたのですがNotice: Undefined variable: where・・・。 と表示されて実行できません。 なにぶんPHP初心者なのでわかり易く教えてください。 $search = str_replace(" ", " ", $text); $keywords = preg_split("/[  ]+/",$text); $where = " where 1"; foreach( $keywords as $word ){ $where .= " and $key2 like '%$word%'"; } //SQL文 $result = mysql_query("select * from song $where ORDER BY number ASC LIMIT $start,$end");

    • ベストアンサー
    • PHP
  • PHPとMySQLについて

    PHPとMySQLについて PHP、MySQLともに初心者の者です。 ネットの情報を参考に以下のようなプログラムを作成しました。 <?php //ファイルを読み込み require_once("DB47.php"); // クエリを送信する $sql = "SELECT * FROM japanDB ORDER BY PREF_CD"; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "".$row["PREF_CD"]." ".$row["PREF_NAME"]." "; $tempHtml .= "\n"; } $msg = $rows."件のデータがあります。\n\n"; }else{ $msg = "データがありません。\n\n"; } //結果保持用メモリを開放する mysql_free_result($result); ?> <?= $msg ?> <?= $tempHtml ?> これはデータベースに 1、北海道 2、青森 ・  ・ ・  ・ ・  ・ 47、沖縄 といった情報を与えており、PHP側でMySQLに接続し、その内容をコマンドプロンプト上で表示するといったものです。 しかし、PHPプログラムを実行してしまうと、全データが一気に表示されてしまうので、見づらいものとなっています。 そこで、地名や番号を入力すれば、地名を表示するような検索機能を付けたいのですが、PHPからMySQLデータベース内を検索する方法が分かりません。検索機能をこのプログラムに組み込みたいのですが・・・。 どなたかご教授お願いいたします。 ***環境*** OS : Windows XP Pro PHP4.2.3 、MySQLインストール済み **********

    • ベストアンサー
    • PHP
  • cronを使った最適な処理[PHP]

    現在、cronを使用して以下の処理を実現したいと思っておりますが、 どのようなやり方が最適なのか困っております。 ■やりたいこと http://goodkeyword.net/ こちらのサイトに検索ワードを指定して、アクセスし その検索結果の一部のテキストを抽出してmysqlに保存。 また、指定する検索ワードは既にmysqlに入っており、50000語くらいあります。 アクセスする際にはデータベースから検索ワードを引っ張てきて以下のようにアクセスします。 $url = 'http://goodkeyword.net/search.php?formquery=' .$hoge['keyword']. ''; file_get_html($url); 上記処理をもし、ループ処理するとしたら問題なくできますが、 如何せん、約50000回のループ処理はこちらのサイトにも迷惑になるので 好ましくないのかなと思っております。 どのようしたらよいのか正直困惑しておりますので、 解決策をご教授いただけますと幸いです。(cronを使った解決策でお願い申し上げます。)

    • ベストアンサー
    • PHP
  • phpとmysqlでサイトのコンテンツを制作しているのですが...

    phpとmysqlでサイトのコンテンツを制作しているのですが、どうにも解決できないのでどなたかアドバイスをいただけないでしょうか? mysqlで $result = @mysql_query( 'drop tabl main_categories;' ); $sqlstr = "create table main_categories (id INTEGER primary key AUTO_INCREMENT,"."category TEXT)"; $result = mysql_query( $sqlstr ); としてテーブルを作ってこれをphpでデータを取得し格納したいのですがうまくいきません。取得データを $arr=mysql_fetch_array($result); で格納してforeachで出力?したいのですが。。。 foreach( $arr as $key => $value ) { if($value['category'] != ''){ array_push($categories_arr,$value['category']); array_push($catid_arr,$value['id']); } } どなたか教えてください!もう8hはまってます=3

    • 締切済み
    • PHP
  • PHPからMySQL・異なるDBにコピー

    PHPからMySQL・異なるDBに接続し同じ構造のテーブルのデータをコピーすることは可能ですか? 以下を実行するとクエリが実行されず「コピーできません」が表示されてしまいます。 どのようにすればコピーできるか教えてください。 $connect1 = mysql_connect("localhost", "user1", "pass1") ; mysql_select_db("db1", $connect1); //db1内にtable1 $connect2 = mysql_connect("localhost", "user2", "pass2") ; mysql_select_db("db2", $connect2); //db2.内にtable2 $sql = "INSERT INTO `db1` . `table1` SELECT * FROM `db2` .`table2`;"; $result = mysql_query($sql, $connect1)or die("コピーできません"); //$result内「$connect1」でも「$connect2」結果は同じです。 //table1とtable2の構造は同じです。

    • ベストアンサー
    • PHP
  • MySQLでもPHPでも出来る処理はどっちでやる?

    「MySQL」「PHP」、何れでも出来るような処理はどちらでやる方が良いのでしょうか? ■例1 … 取得データを正規表現で加工して利用したい場合 ・SQL重視 … 正規表現等を駆使したSQLで、後々利用しやすい形で取得 ・PHP重視 … 普通に取得して、PHPで正規表現を利用して加工 ■例2 … データ取得がヤヤコシイ場合 ・SQL重視 … (例えそれがどんなに長くなっても)SQL文をキチンと組み立て、一度にデータ取得 ・PHP重視 … 簡単なSQL文で一旦データ取得後、PHPのループ文内等処理で、再度DBアクセスしデータ取得 ・ちょっと例えが微妙かもしれないのですが、そもそもデータ取得する際、どのように考えるのが正しいのでしょうか? 1.なるべく利用予定に近い形でデータを取得 2.後で色々加工するかもしれないので、取得時点ではあまり加工せず、そのまま取得 ※要は、頻繁にDBへアクセスしてデータ取得するより、「DBへアクセスするのは極力避け、取得したデータはなるべく使い回す」方が良いのでしょうか? ・それとも、ここら辺はケースbyケースなので、一概には言えないのでしょうか? ・あるいは、別にどっちでもいい? あまり、気にしなくても良い?

    • ベストアンサー
    • MySQL
  • phpの変数をmysqlへの命令文に含みたい

    mysqlへの接続等は完璧で問題なのは、phpの変数を含んだmysqlへの命令文です。 これは試行錯誤した上で間違いないと思いました。 具体的には $link = "接続の情報"  $table = "具体的なテーブル名" $result = mysql_query("select * from $table",$link) $row = mysql_fetch_array($result, mysql_assoc) としたときに print_r($row); が無反応です。 元のソースが今、手元にないので細かいところを間違えているかもしれませんが、select文で$tableを書く代わりに直接「具体的なテーブル名」と書いたらうまくいったので、phpの変数をphpからmysqlへの命令文に含む方法に問題があったと思った次第で、この方法を教えていただきたいです。 $linkまで含めて命令できるなら、その方法も教えていただきたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • phpとmysqlの初心者の疑問

    すいませんphpとmysqlの処理のしくみがわかってないです phpの処理の中でmysqlからSELECTで値を取得する場合 mysqlが大量のデータで処理に時間がかかった場合は、SELECTの処理に5秒くらいかかっても、phpの処理の中でそこで待ってくれているんですか? SELECTの処理が何秒かかったとしても終わってから次のphpの処理にいっているんですか? phpって速いのにmysqlのスピードが遅かったらちゃんと読み込まれないんじゃないかと心配になっています

    • ベストアンサー
    • MySQL
  • PHP+MySqlでの検索

    検索ページから下記のソースに検索結果を表示させようと思っておりますが、スペース区切りにして検索をかけるとヒットしません。 こちらのソースのどの部分にどの様なSQL文を書けば実装出来ますでしょうか? 宜しくお願いします。 <?php require_once('Connections/tm.php'); ?> <?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION < 6) { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; } $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } $colname_search = "-1"; if (isset($_GET['search'])) { $colname_search = $_GET['search']; } mysql_select_db($database_tm, $tm); $query_search = sprintf("SELECT * FROM posts WHERE title LIKE %s ORDER BY modified DESC", GetSQLValueString("%" . $colname_search . "%", "text")); $search = mysql_query($query_search, $tm) or die(mysql_error()); $row_search = mysql_fetch_assoc($search); $totalRows_search = mysql_num_rows($search); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題ドキュメント</title> </head> <body> <table width="583" border="1"> <tr> <th width="82" scope="col">タイトル</th> <th width="113" scope="col">メッセージ</th> <th width="111" scope="col">開始時間</th> <th width="105" scope="col">名前</th> <th width="138" scope="col">詳細</th> </tr> <tr> <td height="20"><?php echo $row_search['title']; ?></td> <td><?php echo $row_search['message']; ?></td> <td><?php echo $row_search['modified']; ?></td> <td><?php echo $row_search['n_name']; ?></td> <td><a href="request_list.php?recordID=<?php echo $row_search['id']; ?>">詳細</a></td> </tr> </table> </body> </html> <?php mysql_free_result($search); ?>

    • ベストアンサー
    • MySQL
  • PHPからMySQLへの検索

    PHPからデータベースの検索について勉強をはじめたばかりで初歩的な質問かと思いますが過去ログを読んでも解決しなかったため質問いたします。 たとえばデータベースに教授名や授業名などを収納しておいてPHPで教授名を入力すると授業名等が表示されるようにするスクリプトを作ろうと思っているのですがうまくいきません。 少なくともMySQLで『田中』という教授名は入っているので検索すれば出てくるはずなのですが検索件数が0件になってしまいます。 テキストボックスに入力された情報を受け渡すところに原因がある気がするのですが原因はわかりませんでした。 おわかりになりましたらご教授ください http://iskiso3.hustle.ne.jp/test.php <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-type" content="text/html; charset=EUC-JP"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>テスト</title> </head> <form action="test.php" method="post"> 教授名を入力してください<br> <input type="text" name="namae" size="30"> <input type="submit" value="送信"> </form> <body> <?php $name = $_POST['namae']; $con = mysql_connect("mysql3.naid.jp" , "ID" , "PASS") or die ('DB Connection Error= '. mysql_error()); mysql_select_db("iskiso3", $con) or die ('DB Connection Error= '. mysql_error()); $sql = "select * from jugyou where kyouju like "*$name*" "; $result = mysql_query($sql,$con); if ( $result == $FALSE ) { die("Search Result: 0 items"); } $num = mysql_num_rows($result); print "<table><tr><td>科目名</td><td>教授名</td><td>内線</td></tr>"; for ($i=0; $i<$num; $i++) { $r = mysql_fetch_row($result); print "<tr><td>$r[0]</td><td>$r[1]</td><td>$r[2]</td></tr>"; } print "</table>"; ?> </body> </html>

    • ベストアンサー
    • MySQL

専門家に質問してみよう