- ベストアンサー
phpの処理速度とmysqlについて
- phpの処理速度とmysqlについて
- httpリクエストをしているので、ある程度かかっても仕方ないと思っているのですが、大体どれくらいなのか気になった次第です。後、1つのファイルで下くらいのmysql処理は別に多くないですよね?
- mysqlから特定のキーワードを取得し、それを基にhttpリクエストを送り、取得した内容を一部mysqlに保存・更新する処理です。処理速度については、6.343くらいかかっているようです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>また、一度に5万件リクエストを送る訳でなく、 >1時間に30~40回リクエストで考えております。 >時間はかかりますが、相手側を考えますとこれくらいなら大丈夫かなと >思っておりますが、いかがでしょうか? まぁそのくらいのリクエスト数であれば特段目に余ることはないと思いますが 逆に1時間に多少多目にみて60回のリクエスト(1分に1リクエスト)だとしても 5万件処理するのに1月以上かかりますが、それでよろしいのですか? また長期間にわたりあまり頻繁にアクセスすると、結局攻撃者とみなされて、 レスポンスを拒否されたり、処理順をおとされたりするかもしれません。 ということで同サイトの処理能力からみておそらく実用に堪えないかと
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
>相手側の処理能力の問題で大きなトラフィックをさばいているサイトでしたら、 >そんなに問題はないということでよろしいでしょうか? 一言でいえば運用者が恣意的に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)
ああ、例の5万件の続きですか・・・ 1リクエストが秒単位でのレスポンスでは5万件の処理は無理ですね もしサーバー過負荷だとしたら業務妨害で訴えられるレベルの作業かも (岡崎市立中央図書館事件てきな・・) もしサーバーに負荷をかけて問題ないなら、wgetなどのクローラーを 裏でまわして非同期処理する必要があるかも
お礼
改めまして、ご回答ありがとうございます。 先ほど、ループで三度リクエスト送ってみましたが、 chromeのtimingで確認しましたところ以下のようになりました。 sending: 0ms waiting: 2.9s receiving: 1ms これでも、問題ございますか? どの程度が好ましいのかわからず困惑しております。 また、一度に5万件リクエストを送る訳でなく、 1時間に30~40回リクエストで考えております。 時間はかかりますが、相手側を考えますとこれくらいなら大丈夫かなと 思っておりますが、いかがでしょうか?
処理時間短縮への工夫 ○ 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
お礼
ご回答ありがとうございます。 >○ HTTPリクエストを並列にする やはり、並列でやるのがベストっぽいですね。 参考にさせていただきます。 >○ プリペアドステートメントを使いまわす 同じ物のprepareじゃない場合はループの外でキープしても無意味ですよね? こちらも情報ありがとうございます。
お礼
時間がかかってしまうのはいた仕方がないと思っております。 結局は、相手側の処理能力の問題で大きなトラフィックをさばいているサイトでしたら、そんなに問題はないということでよろしいでしょうか? また、追加になりますが、疑問がありますので質問させてください。 クロールしてくるのに、wget,Pavuk,cURLなどがあると思いますが、これらのコマンドは丸々取得はできますが、例えばあるサイトの画像のパスや特定のタグの中のテキストを抽出するといった、加工が必要になってくると上記コマンドでは困難ですよね?(grep,正規表現は使えばできなくないと思いますが) もし、困難だとすると、あるサイトの画像のパスや特定のタグの中のテキストを抽出する場合は、wgetなどのコマンドを使用するより、file_get_htmlなどの方が作業的には楽になると思うのですが、認識はあっていますでしょうか? また、wgetやfile_get_htmlなどで相手側に与える負荷の差は特にないと思っているのですが、どうなんでしょうか? 恐れ入りますが、ご回答宜しくお願い申し上げます。 また、ご回答いただきました後、ベストアンサーとさせていただきます。