トップページ⇒php
817コメント199KB

★負荷軽減対策委員会(Perl、PHP)★

■ このスレッドは過去ログ倉庫に格納されています
0001ジークハルト ◆VUxx/EwNXI 02/10/15 10:33ID:ifgLRUyb
サーバ上にPerlやPHPを置く場合、何よりも重視しなければ
ならないのはサーバへの「負荷」。
負荷の高いCGIの使用は削除対象となるのが目に見えてます。
負荷を軽減させるにはどうすればいいか?
どういう書き方をすればいいか?
そんな委員会を開設しました。
0623nobodyさん04/03/17 17:24ID:???
HTTP/1.1 のチャンクコーディングを忘れてない?
試しにnph ソースを作って、Content-Length を送信するようにしたら、
チャンクコーディングされなかったけど、接続が毎回切れるみたい。

どっちが良いのか微妙っぽい。
0624nobodyさん04/04/20 20:30ID:yfis5kmt
age
0625nobodyさん04/05/16 04:46ID:2fTgoYEJ
A.. if($aa=~/x/){$pa=1;$pb=1;}else{$pa=0;$pb=0;}
B.. $aa=~/x/?($pa=1,$pb=1):($pa=0,$pb=0);

等価らしいです
ソースは、ttp://ww4.tech.nu/?d=653

たしかにコードは短くできるので試したところ
レスポンスが悪く、重くなった気がします
0626nobodyさん04/05/16 04:54ID:???
>>625
http://perldoc.com/perl5.8.4/lib/Benchmark.html
0627nobodyさん04/05/16 10:10ID:???
>>625
三項演算子使ってるだけでしょ、普通に使うけど。
レスポンスは落ちるのかなぁ? 
0628nobodyさん04/05/16 11:14ID:???
>>627
藻前は一つ前のレスが読めねーの?
0629nobodyさん04/05/20 12:34ID:NShBOzWM
PHP普及の原因は、イスラエル・Zend社のマーケティングの成功にある。
�@Perlでは別インストールで多くの人が知らないデーターベース利用を標準で使用できるようにし、「データーベースが簡単に取り扱える」というイメージを特に強く植えつけた。
�Aウェブサイト作成への特化。例えば、セッション管理がそうだ。
�Bソースの隠蔽による著作権保護を可能にした。
データーベースを使いたいが、使い方がわからない。そこに、PHPなら使えるという情報が先に入る。これで、PHPに入った人もかなり多いはず。
PHPの言語仕様はZendに大きく左右される。
二年ほど前、PHPが出始めた頃には、変数のスコープがPerlとまったく同じ仕様だった。
もともと、Perlのソースコードを改編して作成されたPHP。
↓PHPの歴史
http://php.planetmirror.com/manual/ja/history.php
PHPには、Perlコードの退行による高速化の意図が言語のいたるところに見える。
マイクロソフトは、オブジェクト指向への対応というのが大義にVB6.0からVB.NETに言語仕様を大幅に変えた。
今後も大きく言語仕様が変わることはないのか?
オープンソースとは言っても、Zend社の
http://www.zend.com/management.php
の数人のスタップによって大きく左右される。
再帰的定義とされる「PHP:Hypertext Preprocessor」という名前にも理由がある。これは、要するに、正確には、「Perl Hypertext Preprocessor」としたいところだが、GNUの「GNU is Not UNIX」という再帰的な定義をもじったものだ。
要するに、「GPLのフリーソフトのライセンスには違反していませんよ!」と一つには主張し、また、一つには、「PHP is Not Perl」とでも言って、Zendの社としての姿勢を、先人の「Perl開発者たち」から擁護する意図があったのだろう。
Nではなく、Hなのが、そのための味噌だ!Perl開発者たちは、当然、面白くないはずだ。
PHP信奉者は、六芒星(hexagram)マークのユダヤ教にでも、入信せよ!

0630nobodyさん04/05/20 13:06ID:9F0Z79In
Cで組め。手っ取り早く最速で負荷を極力少なくできる。
0631nobodyさん04/05/20 14:55ID:???
負荷を少なくするならまず、
データ構造とアルゴリズムを見直せ
次にCPUをグレードアップしろ
それでもダメならCか汗ブラで
0632nobodyさん04/05/20 15:38ID:???
スタップ?
0633nobodyさん04/05/20 16:08ID:???
PHPって
Personal Home Page の略?
0634nobodyさん04/05/20 16:11ID:cgjPprlD
ここできくなよ
0635nobodyさん04/06/24 13:00ID:???
喪主
0636nobodyさん04/07/18 20:12ID:Sl8hc8ID
>>629は、洩佐渡にアボーンされるよ。
0637nobodyさん04/08/11 03:33ID:2sgdWAV8
なんで掲示板をテキストファイルに出してるんだ?
データベースに入れてしまうのってよろしくないの?
最後の方を読む時とかに早いと思うんだけど。
0638nobodyさん04/09/07 11:18ID:???
保守
0639nobodyさん04/10/04 17:10:56ID:???
ゲッシュ
0640nobodyさん04/10/12 03:56:07ID:???
2chの話になるけどさ、sageで書き込みするとスレッド位置が変わらず、
index.htmlとsubback.htmlの更新・ソートを省略できて負荷軽減に繋がらない?

と思ったけどレス数表示のために更新しなきゃならないか…。
もう少し工夫すればなんとかなる気がする。
0641nobodyさん04/10/17 09:28:30ID:???
ディスクのアドレスに直接書き込めばいいと思うよ
0642nobodyさん04/10/17 10:04:16ID:???
>641

マジレスするとそんな低レベルの操作をしたら
処理中は他の処理が出来なくなるだろうが
0643nobodyさん04/10/20 23:44:33ID:gn/p6wba
あげマン
0644nobodyさん04/10/21 19:27:52ID:vF6/MaNc
掲示板なら静的HTML生成が一番簡単で一番効果がある。
スクリプトをあれこれこねくり回す前に試してみれ。
0645nobodyさん04/10/21 19:55:41ID:???
>644
誰に対してのレス?
0646nobodyさん04/10/22 21:15:01ID:???
javaでクッキーを保存する方法が載ってれば全部HTMLにするのに
0647nobodyさん04/10/23 23:24:38ID:???
java?javascriptじゃなくて?
0648nobodyさん04/10/24 01:33:51ID:???
>>644
それは理解した上で別の方法を模索するスレなのでは?
0649nobodyさん04/10/24 04:14:11ID:???
>>647
javascript
0650nobodyさん04/10/24 14:11:54ID:???
javascriptでクッキー出力はできるけど・・・多分違うことなんだよな
0651nobodyさん04/10/24 18:28:23ID:???
静的HTML生成ってどうやればいいの?
0652nobodyさん04/10/24 19:00:16ID:???
>>651
ファイルに出力
0653nobodyさん04/10/25 05:14:38ID:???
>>649
ようするにHTMLでクッキー機能できるようにすりゃいいってことでしょ?
0654nobodyさん04/10/25 05:44:32ID:XKm5So8L
セットはcgiですればいいから、あとはそれをJavaScriptでゲットすればいいんだよ。
0655nobodyさん04/10/25 14:51:34ID:???
ファイルの読み書きはperlのキモの部分だから、せめてこれだけは理解しましょう。
0656nobodyさん04/10/25 15:08:33ID:???
javascriptでゲットする方法が載ったサイトきぼん
0657nobodyさん04/10/25 15:35:37ID:???
getCookie
0658nobodyさん04/10/25 17:09:16ID:???
htmlの不都合点とかあるかな?
NEWマーク表示できないくらいしか思い浮かばん
いらん機能だし
0659nobodyさん04/10/25 17:26:29ID:7ozi48tg
>>658
出来る。
0660nobodyさん04/10/25 17:29:59ID:7ozi48tg
HTMLの不都合は、たとえばSSI使わないとカウンターが表示できないとか。
0661nobodyさん04/10/25 23:10:16ID:???
オールHTML化するとレイアウトを変更したときが面倒なんだよなぁ。
ファイル数も結構増殖していくし。

それくらいかの。
0662nobodyさん04/10/26 02:14:41ID:???
>>656
このスレのソース。
0663nobodyさん04/10/26 06:22:53ID:???
>>662
サンクス
0664nobodyさん04/10/27 10:01:04ID:???
HTMLでクッキーとか機能させるって言ってるけどIE以外は無視?
operaやMozillaだと文字化け起こすぞ
0665nobodyさん04/10/27 10:20:49ID:???
IE以外いいよってみんな思ってるんじゃない?
実際そうだし2chもそうだからいいかな、と。
0666nobodyさん04/10/27 10:40:24ID:GQQpVWEo
tcupの掲示板てどうなってんだろう。
拡張子無しで/bbsってなってるのが昔から不思議で。
googleなんかのuri表示で見ると、
http://xxx.teacup.com/yyyy/bbsだと、
www.tcup-.com/xxx/yyyy.htmlが本体らしいんだけど。
0667nobodyさん04/10/27 11:17:53ID:???
javaだとIE以外じゃ日本語取得できないのかorz
みんな妥協派ですか?
0668nobodyさん04/10/27 11:57:31ID:???
>>666 >>667
http://pc5.2ch.net/test/read.cgi/php/1095633323/
0669nobodyさん04/10/27 12:24:58ID:???
>>668
だからIE以外じゃできないってのアホ
0670nobodyさん04/10/27 16:51:51ID:pygimpYU
>>668
( ´,_ゝ`)プッ
0671nobodyさん04/10/27 22:34:47ID:???
>>666
http://www.google.co.jp/search?sourceid=navclient-menuext&ie=UTF-8&q=%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%AA%E3%81%97%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E8%A8%AD%E5%AE%9A
0672nobodyさん04/10/27 23:34:24ID:???
閲覧時にクッキー使ってなにがしたいの?
投稿時ならともかく。
0673nobodyさん04/10/27 23:38:06ID:???
例えばツリー、スレッド表示の切り替えとかじゃね?
0674nobodyさん04/10/27 23:48:20ID:???
お!早い。
切替ならそれぞれリンクを用意するだけで済むのでは?
閲覧時のクッキーってストーキング用途しか思いつかない。
0675nobodyさん04/10/27 23:57:22ID:???
>>674
それだけしか思いつかないおまいの脳に乾杯
0676nobodyさん04/10/28 03:33:14ID:???
>>664-667あたり
2chで化けるのはbbs.cgiで発行してJavaScriptで取得してるからじゃ?
0677nobodyさん04/10/28 06:29:55ID:???
javaで発行すると問題あるんじゃなかったっけ?
0678nobodyさん04/10/28 07:03:35ID:aCWpvFRR
つーか無理にHTML表示なんかせんでもいいよ。
動的にやればインタラクション的にも手軽になんでも出来るし。
0679nobodyさん04/10/28 07:20:03ID:???
わざわざ内部に組み込むのがアレだって話してんだろ
0680nobodyさん04/10/28 08:43:20ID:???
掲示板の1ページ目だけだけど
HTMLにすんのとしないのとじゃけっこう差出るの?
0681nobodyさん04/10/28 09:01:31ID:???
htmlファイルに書き出すかどうかは、そのサイトへの訪問者の利用状況によって異なる
一概に○○なら△△とはいえない。
まあ、統計的に、そのページが更新されるまでに10回以上アクセスされるとわかれば、
一般的にはhtml化した方がいいだろうな。

式にすれば

html化するコスト << html化しない場合のCGI起動コスト * not modify間での平均アクセス数

の場合は、html化のメリットが大きい
0682nobodyさん04/10/28 14:03:48ID:???
まあHTMLよりCGIの方が負担少ないなんてことはないな
0683nobodyさん04/10/28 15:02:48ID:???
>>678
このスレは負荷軽減がテーマなんだが?
0684nobodyさん04/10/28 15:05:59ID:???
まあHTMLにしないで負荷を軽減する方法を模索していくのもいいんでない?
0685nobodyさん04/10/28 16:23:56ID:???
むしろHTML化できないからプログラムの負荷を下げる必要があるんじゃね?
本当に負荷を下げたいならCGIなんか使わずサイト丸ごと圧縮しておくのが一番だろうし。
俺はCGIを作る側だけど実は↑これが一番好き。
0686nobodyさん04/10/28 19:02:58ID:???
しかしコスト(時間や手間込み)単位での効果ならやはり静的HTML生成がベストチョイスなのも事実だし。
まあ両面作戦だね。
0687nobodyさん04/10/29 00:44:55ID:???
1, Requests per second: 2.67 [#/sec] (mean)   perl/cgi
2, Requests per second: 17.53 [#/sec] (mean) mod_perl (1と全く同じソース)
3, Requests per second: 60.22 [#/sec] (mean) html (1,2のプログラムで出力された物をhtmlで保存した物)
DBIやarchive等、結構重いモジュールを読み込んでDBにアクセスして表示するプログラム。mod_perlのDBアクセスは永続化している。
処理内容によって一概にいえないけど1つのパターンとして参考までに。

静的htmlだとカウンターだのダイレクトに表示出来ないしクッキーも文字化け(IEではunicode,xxxだとURLencodeだの)
等の問題が発生してめんどくさい。クライアント依存の処理はやはり気持ち悪い。
0688nobodyさん04/10/29 07:10:04ID:???
>>687
これって数字高い方がいいってことなの?
ベンチマークに無知でスマソ

確かに文字化けるんだよな・・・
ユーザにHTMLとCGIモードを選ばせるようにしたらいいかも
0689nobodyさん04/11/04 17:30:49ID:???
書き込みのときjavascriptでクッキー発行すれば化けんよ。
0690nobodyさん04/11/10 00:14:30ID:???
「>>1」
このアンカー、2chではタグをアクセスごとにつけてるんだっけ?
0691nobodyさん04/11/10 01:11:49ID:???
>>690
んだよ、ほれ。
http://pc5.2ch.net/php/dat/1034645635.dat

サニタイジングもregist時にやってるな。
2chは書き込みも多いが、それ以上に読み込みが凄まじいからな。
0692nobodyさん04/12/23 11:27:06ID:???
でつ<喪主
0693nobodyさん05/01/07 17:35:04ID:qgEKEyAA
質問なんですが、
リンクトレードproやThe Roomのランキングリンクのようなエロサイトによくあるランキングを
PHPで作ってみました。ユーザーごとに情報を1行CSVに保存させて、それがカウントファイルも兼ねてます。
表示部分は静的です。

出来上がったところで、上司に負荷かかりそうだからDBにしてよと言われ、MySQLで作り直してみたところ、
現在ユニーク1万/日くらいのサイトであっというまにMySQL接続数多杉エラーが出ました。
サーバ管理者にMySQLの接続数多すぎと出ましたと言ったところ、
設定変えることもできるけど、トラフィック多いサイト目指すならPostgreSQLにしたほうが良いといわれました。

今とりあえず素直にPostgreをサイト見ながらソース書き直してますが、
一体どの方法がベストなんでしょうか。

ちなみにPHPは趣味レベル、DBの経験は今年からなのでソースに問題があるのかもしれません・・
0694halc05/01/07 18:03:52ID:???
>>693
postgresにすれば良いってわけじゃないような。
ユニーク1万/日ぐらいだと、squidでリバースプロクシを導入してみるとかは?
069569305/01/07 18:12:16ID:???
>>694
今後増える予定です。目標が10万PV/日くらいです。
0696halc05/01/07 18:22:54ID:???
>>695
同時接続数を増やせないなら、1接続あたりの接続時間の短縮をやらんといけない訳で。
もうクエリを発行しないと分かった時点でコネクション切断とか、
そのレベルの最適化はやってるよね?
初心者らしいから言ってみると、WHERE句、LIMIT, OFFSETで取得数を限定して、
DBから取得したけど使わず捨てているデータを削りこむとかやってみそ。
069769305/01/07 18:56:00ID:???
>>696
やってるつもりなんですが、、
inのカウント取得ファイルのソースをコピーしてみます。
http・・・xxx.php?usrid=$usridで叩いて、DB開き。
$tabledata = mysql_query("SELECT * FROM usr_table",$db);
//配列に入れ
while($row = mysql_fetch_array($tabledata))
{$usr_array[$row[usrid]] = $row;}
//t1フィールドに直前IP記録&カウント
if($rmhost != $usr_array[$usrid][t1]){
$incountup = mysql_query("UPDATE usr_table set incount = ceiling(incount + 1) where usrid = \"$usrid\"");
$ipupdate = mysql_query("UPDATE usr_table set t1 = \"$rmhost\" where usrid = \"$usrid\"");
}
mysql_free_result($tabledata);
mysql_close($db);

if( !$db ) {
print "接続できません。<br>\n";
exit;
}
header("location:{$homeurl}");

これだけです。これで動いたんですが、やっぱり記述おかしかったりしますかね、、?
0698nobodyさん05/01/07 19:50:01ID:???
まさか mysql_pconnect とか使ってないよね?
0699nobodyさん05/01/07 21:06:14ID:???
>>693
ランクカウント以外の部分(順位の表示とかカテゴリ参加数の表示とか)はどう処理してる?
もしリアルタイムでやってるなら、静的なHTMLで処理するとかcronで処理させるとかすると、
劇的にコネクト数は減るよ。

ユニーク1万にも耐えられないならDB使う意味ないし、Postgresにすりゃいいってもんでもないと思ふ。
やはり、設計段階からの見直しが必要かと。。
毎秒何回ぐらいqueryの発行あるか分かるなら書いてみて。
070069305/01/07 21:46:52ID:qgEKEyAA
mysql_pconnect思いっきりつかってますが、、それって駄目なんですか?

>>699
順位他の処理は、3600秒ごとに静的に書き出してテキストファイルをrequireしてます。
cronではなく、テキストファイルにタイムスタンプ書き出してアクセスごとにチェック、前の書き出しから+3600秒以上経っていたらランキング再書き出し、という感じです。

>ユニーク1万にも耐えられないならDB使う意味ないし、Postgresにすりゃいいってもんでもないと思ふ。
ですよね。。
毎秒何回query発行あるか、どこで見れば良いんでしょう。。
とりあえず今はサイト止まってしまうので旧テキストファイル版に戻してしまいました。
0701nobodyさん05/01/07 22:16:37ID:???
>>700
やはりそれぢゃったか

mysql_pconnect して DB に接続すると
mysql_close しても
スクリプトが実行を終了しても
それどころかクライアントがブラウザを閉じた後も
DB接続が切断されずに残り続けるんぢゃよ
つまり今の状態だと mysql_close が全く効いておらん

これは接続をプールして再接続の負荷を減らすためのGJな機能なんぢゃが
DB接続数上限が逼迫している状態では逆に足を引っ張ってしまう両刃の剣
素人にはお薦めできないとまでは言わないが、注意して使わんといかんのぢゃ
mysql の最大接続数を apache の MaxClients より大きく設定する、とかぢゃな

とりあえず mysql_pconnect を myqsl_connect に変更すれば
mysql_close で接続が切断されるようになるので
かなり状況が改善するんぢゃないかのう
0702nobodyさん05/01/08 00:00:05ID:???
>>701
勉強になったありがとう。
070369305/01/08 01:09:47ID:???
うわー、、そうだったんですか。
きっとそれっぽいですね。
大変勉強になります。ありがとうございました。とりあえずそれを試してみます。
0704halc05/01/08 04:03:06ID:???
>>697
なんてか、削り込み以前にDBMSの本をちゃんと読もうよ。。
  header("location:{$homeurl}");
と、リダイレクト先URLしか要らないのに、
  $tabledata = mysql_query("SELECT * FROM usr_table",$db);
ここで全テーブルデータをぶっこ抜いているのがそもそもの間違い。

ここは
  $tabledata = mysql_query("SELECT * FROM usr_table WHERE usrid = \"$usrid\" ",$db);
と必要な行以外は抜いてこないように直すべき。
0705halc05/01/08 04:13:11ID:???
全テーブルぶっこ抜きの方法は、いわゆる「MySQLでかんたん掲示板」系の
入門書から取ってきたんだと思うけど、このやり方、小さな個人サイトなら
またしも10万PV/日のサイトに使える方法じゃない。

という訳で入門書以外のDBMS専門書を読むことを勧める。
0706nobodyさん05/01/18 10:29:13ID:???
perl のDBMモジュールでも
データーベースオープン
全データーを配列にコピー
データーベースクローズ
その後配列に対して処理色々なんてことをやってるスクリプトを見かけるが
全部読み込まなきゃいけない処理なら普通のファイルに保存したほうが軽くて速くないか?
0707nobodyさん05/01/18 13:57:10ID:???
>>706
早いかもしれないけど影響がでるほどの量だとすれば、
データの書き込み(更新)する必要がある場合dbでやる方が安全だと思う。
0708nobodyさん05/01/19 10:26:45ID:???
>>707
いや、だから、あのさ(w
db使うなら丸ごと読み込んだりしないだろう?普通
0709halc05/01/20 23:11:44ID:???
全ぶっこ抜きじゃトランザクション隔離のかけらも無いよなぁ
0710nobodyさん05/01/29 14:37:47ID:8oiPQs40
大前提として、どれくらいの規模(データと一日あたりのhit数)になったときに
プレーンテキストからDBに移行するべきなのかという目安を考えるべきだと思う。
0711nobodyさん05/01/29 15:49:02ID:???
サーバスペックやスクリプトの作りにもよるからなあ

とりあえず思いつくのは

・アクセス頻度と平均処理時間から待ち行列を計算して「ヤバ」と判断したとき
・top の load average が 1 を超えたとき
・HDDのスワップ音が聞こえるとき
・体感的に「重い」と感じたとき
0712nobodyさん05/01/30 01:18:32ID:???
表示用HTMLファイルとか作成しちゃうなら、場合によっては
小規模でもデータはDBで管理した方が良いね。
0713nobodyさん05/01/30 05:59:08ID:???
そうだな、俺もDBが動いてる環境なら規模によらず常にDBを使う
0714nobodyさん05/02/08 01:21:04ID:???
私もDB使っちゃうな
0715nobodyさん05/02/19 00:53:49ID:???
orz
0716nobodyさん2005/05/06(金) 15:00:41ID:???
DB使った方がコストが安くすむ…場合もあるからDB使っちゃうな。
こんな俺はきっと駄目なPGだ orz
0717nobodyさん2005/05/06(金) 19:18:23ID:???
Plain text - 43FoldersWiki
http://wiki.43folders.com/index.php/Plain_text

どうでもいい;)
0718nobodyさん2005/10/07(金) 14:59:04ID:???
落ちないもんだな・・・
0719nobodyさん2005/10/08(土) 16:41:55ID:???
w
0720nobodyさん2005/10/14(金) 03:04:33ID:???
↑
0721nobodyさん2005/10/14(金) 18:19:58ID:???
httpd.conf 最適化とかリバースプロキシとかの話はここではしてないの?
0722nobodyさん2005/10/16(日) 01:53:02ID:???
>>721
それはWebProgを走らせる「環境」の話だから。
ここは共有鯖で使うCGIの負荷を以下に下げるかの話するスレ(機能してないけど)
■ このスレッドは過去ログ倉庫に格納されています