read.cgi再開発スレ
■ このスレッドは過去ログ倉庫に格納されています
稼働させると問題が多発しているread.cgiを再開発等を話しあうスレッド
です。
アイデア等がありましたらこちらへどうぞ >>341
えーと......ベースのソースと cgidso 版の diff ってことでしょうか?
ベースのは >>61 にありますが...... >>345
そです、そです。
なるほど、こっちで作ってもいいのかも。
でもねんのため、送っておいていただけるとうれしいです。 わおっ CC で saitama@saita.ma もー 今のだと(あたりまえだけど)dat落ちしたスレは、読めないすね。
さて、どっかに実験環境(>>311 の 3)を作るのがいいのかしら。 このまま live8 でやろうかと、、、
最新のを持ってきて(どこにあるんでしたっけ? qb6 ?) >>341 >>349 すみません......メーラが挙動不審で手間取りまして遅くなりました.
今お送りしました. >>355
何度かリロードするとおかしくなりますね。。。。 >>356
受け取りました。どもです。
>>357
こっちでは、えっちなのはいけないと思います。って出てる。 ふんふん
この辺は最新のにしてから DSO の性質を見つつ
read.c をぼちぼち触っていくという作戦かと、、
現状では リロードで直ると、 Sleipnirを起動しなおしたら直った、、、。
IEでも正常か。
>>359
正しく出るようです。 >>361
たまに表示がぐたぐたにむなるようです。
メモリーの使い方とか、その辺だろうなと、 う〜ん......何かエラーログに出てたりとか httpd が core 吐いたりとかしてますか? core吐きはないみたいですね。
エラーログもそれっぽいのはないみたい。 こちらでもソース見ながら原因考えてみます...... >>359
l50でもリロードするとダメになるときがありますね・・・ これってどの板・スレでも起こりますかね? それとも特定の板・スレのみでしょうか? >>369
適当にいくつか見ましたが板もスレもレス指定も関係なく出てくるようです
http://live8.2ch.net/test/read.cgi/livejupiter/1101557599/-100
以下ソースコード一部(<dt>936 名前の前に改行)
■掲示板に戻る■</a> <a href=./>全部</a> <a href=l50>最新50</a><p><font size=+1 color=red><dd> <a href="../test/read.cgi/liveanb/1101653051/933" target="_blank">
>>933</a> <br> わざととらせたということはないだろうな。あの表情だったら <br><br>
<dt>936 名前:<a href="mailto:sage "><b>名無しステーション </b></a> :04/11/29 02:46:09 ID:055hkqユM </font><dl></dl><hr><a href="../../../../livejupiter/">掲示板に戻る</a> これでdso化したら、プログラムをリエントラント(再入可能)に作る必要がある、ってことなんだろうか。
# ちとねむいっす。ねたら負け組だけど、明日は普通に会社あるし。
# とりあえずふろ。 >>372 reentrant にはしてあります(っていうか,書き換え作業の大部分はそこでしたので).
まぁ見落としなどはあるかも知れませんが......
あと考えられるのは......httpd のビルド時に例えば -D_XOPEN_SOURCE=500 などの
マクロ定義はしてあるのでしょうか? こういうもので変数型が変わるなどの影響が
出ることもあり得るので.
apxs -q CFLAGS CPPFLAGS
を実行して確認して,このあたりのフラグは bbs.so ビルド時もそろえた方がいいかと思います. datが直接表示
http://live8.2ch.net/test/read.cgi/livejupiter/1101557599/-100
<a href=l50>最新50</a><p><font size=+1 color=red><><>04/11/29 02:11:59 ID:sCrhvqx+<> 漏れは白を応援するぜ!! <>
名無しでいいとも!<><>04/11/29 02:12:02 ID:hz69xFMh<> ヤナはフルみたい <>
名無しでいいとも!<><>04/11/29 02:12:04 ID:hDPLKkje<> <a href="../test/read.cgi/livecx/1101659114/707" target="_blank"ユM </font><dl></dl><hr><a href="../../../../livejupiter/">掲示板に戻る</a> >>376
地震は地震板でとあなた自身が自信をもって言っていませんでしたか? それと正反対に、
地震の時はすべての板でやれといってた気がするが、、 取りあえず狐さんは無事だか動物的カン無しと φ(−−) ★実況報告スレ 7★
http://qb5.2ch.net/test/read.cgi/operate/1095572578/
303 名前:FOX ★ 投稿日:04/10/23 19:50:30 ID:???
地震のときは・・・
あちこちで実況しろって言ってんだろ、昔から、
サーバダウン(鯖落ち)情報 Part47
http://qb5.2ch.net/operate/kako/1092/10926/1092652904.html
739 名前:見習い▲▲ ★ 投稿日:04/09/06 00:47 ID:???
地震の時はあきらめましょう、
無理だって、
抵抗しても結局。
744 名前:動け動けウゴウゴ2ちゃんねる 投稿日:04/09/06 00:51 ID:dGftHK51
地震板も実況板もそれ以外の板を守るためにあるのです。
つまり運命共同体ってことで。
>>739
地震系での鯖増強はなしってことか、、、乙です。
746 名前:見習い▲▲ ★ 投稿日:04/09/06 01:05 ID:???
気象庁とか国がやれはせいいんでないの?
野球実況もおなじだけど、なんでも2ちゃんねるで出来るというのは
無理だと思う。 何かをあきらめれば何かが出来るとは思うけど、
実況全部廃止して地震にそなえるとか、 I'm sorry.
It was my misapprehension.
というか
>自身が自信
これが書きたかっただけっしょ?w なんとなく
直ったかも
>>379 とか >>353- >>389 おつおつ
win2000pro IE6sp1にて確認。
5回ほどリロードしてみたけどいいみたい。 おっ、>>353 なおたね。
おつです、おつです。。 >>389 お疲れさまです.こちらでも正常に見えるようです.
# こんな時間ですが,私も気になって......
何か手を加えたとしたら,どんなことでしたでしょうか? RAWモードとか使用していないのを外していったら
直った出ス。
つまり 基本的にはread2ch.h の #define をコメントにしていっただけです。
もともと潜在的にあるバグの気がします。 >>393 なるほど......ともあれ,お疲れさまでした. なるほどそういう事でしたか。
おつでした。
てなわけで、おやすみなさい。 忘れないうちにメモ。
これ入れたら、read.cgiの時はKeepAliveを切らない方がいいのかも。 またまた 質問しておこう
この場合 read,cgi@live8 の出力は mod_deflate で圧縮されるですか? 圧縮されているようです
telnet live8.2ch.net 80
Trying 206.223.151.225...
Connected to live8.2ch.net.
Escape character is '^]'.
GET /test/read.cgi/livejupiter/1101557599/1 HTTP/1.0
Host: live8.2ch.net
Accept-Encoding: compress, gzip
HTTP/1.1 200 OK
Date: Sun, 28 Nov 2004 20:48:35 GMT
Server: Apache/2.0.52
Last-Modified: Sun, 28 Nov 2004 18:50:44 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1010
Connection: close
Content-Type: text/html
(以下バイナリ) 追記:どのモジュールで圧縮されているかまでは・・・・スンマソ おおおおーいよいよmod_cgidso投入ですかー
狐さん&むむむさん&◆cZfSunOs.Uさん乙ですっ!
しかーし 祭りに乗り遅れた・・・orz >>398-400
DEFLATE text/html と指定してあるので、従来どおり mod_deflate は有効です。 live8、IEでスレッド開くと書き込み欄の上に、
10:00PM - 02:00AM の間一気に全部は読めませんって出るけど、
今5:00PMでその状態なってますよ。 (10:00PM - 02:00AM の間一気に全部は読めません)
鯖の時計機能がぬるぽ >>405
最近、その機能消えてたような気がするけどなぁ、、 転送量問題に苦しむと -> 細切れに送って乗り切る
サーバ負荷に苦しむと -> 一気に送って乗り切る
さて、今はどうすべきか・・・
という岐路きろ 時間のずれは......httpd 起動時に TZ=JST-9 にすることは可能でしょうか?
(httpd.conf での SetEnv は効きません)
cgidso 版の read.cgi から putenv() を実行すると httpd プロセスの環境を
いじることになり,これはちょっとおっかないので,その部分のコードは外したのですが.
あと,"Special thanks〜"のところはあまり目立つのも恥ずかしいので,
<span title="Special thanks〜">read.cgi ver8.01+ (04/11/29-)</span>
ぐらいにして頂ければ...... >>416-417
トリップからSolaris10とか(ぇ
◆cZfSunOs.U さんが書くとfusianasanになるとか( 質問です、
dso で動かしている read.cgi ですが、寿命はどれくらいなんでしょうか
あと グローバルな変数を定義したら、共有して使えますか? あまりでしゃばるのもアレなんで、分かる範囲で。
寿命は、apacheの各プロセスと一緒です。
つまり、現在のpreforkだと、MaxRequestsPerChildによって左右されます。
変数の共有は、MPMがpreforkだと各プロセスが独立するので、不可能です。
また、マルチスレッドなMPMにしても、「全体で唯一の変数」にはなりません。
(単に同一プロセス内でのみの共有です)
共有変数や永続的なデータを持たせるには
共有メモリ(やmmap等)で明示的に共有する領域を作成したり
aprのAPIを利用したりする必要があります。
全体にわたる設定やデータを保持したり共有したりするなら
場合によっては、専用サービス(daemon)を作って
apache自体はproxy動作するだけにさせた方が効率がいいかもしれません。
read.cgiと.dat読み込みに特化したhttpdを作るというイメージで。
(servletを動かすのにApacheとTomcatと連動させるのと同じような感じ) >>424
>>425 のとおりです。(>>425さん、的確な説明ありがとうです)
dso な read.cgi は httpd に完全に組み込みになります。
今の FreeBSD 5.3R 系のサーバだと、MaxRequestsPerChild は 1000000 にしてあるので、
100万回httpリクエストを処理すると(bbs.cgiやdat直読みも含む)、httpdが生まれ変わります。
変数の共有はできないです。理由は >>425 の第3パラグラフのとおりです。
で、マルチスレッドMPMは昔試していまいちだったので、現在は通常のprefork MPMにしてあります。 bbs.cgi で今やろうとしているのと同じように,設定や広告などのデータを
1回読んだ後 persistent に保持させたいということなのかな,と想像.
そうであるとすれば,server pool にでも突っ込んでおけばいいのではないかと. >>427
そうそう それですよん
やりたいのは、
現状のread.cgiは一切ファイルを見に行かない(datは別よん)ように
しているのですが、もし可能ならまた夢が広がるってことで、
完全に共有でなくても、bbs.cgiのようにたまに読めば良いなら
使えるな! と、 うはwwwwww夢がひろがりんぐwwwwwwwwwwwwwwwwwwww >>428
ひ(りゃ が広告(例の右上の1行)を見に行くようにしたんじゃなかったかしら。 ex7で
dat落ちのスレッドの表示が
削除と同じ状態になるんですが、、
例)
http://ex7.2ch.net/test/read.cgi/entrance/1102162144/
> read.cgi ver8.01+ (04/11/29-) 「Special thanks ◆cZfSunOs.U さん
> 過去ログ倉庫にもありませんでした。
> 問い合わせても見つかる可能性はほとんどありません。
過去ログ倉庫にあるかどうかの参照は直るでしょうか。 >>431
そのうち、ってかんじかなと。
今のread.cgiは●ができる前のものをベースにしているので、
こうなるです。
OpenJaneで該当スレを読んでみましたが、ちゃんと読めたです。 >>430
それを実現しつつ常駐化して
さらに毎回呼ぶのは避けようというきかくです >>427
Server poolでも良いんだけど、その辺の設定情報的な物は
どちらかというとApacheの設定情報管理用のフレームワークに
のっけて情報管理した方が良さげ。要は
<Files read.cgi>
SetHandler dso-script
SetCgisoValue key value
</Files>
みたくできるように、command_rec型でディレクティブ作る式で。
この場合はmod_cgiso側で設定情報を持って、
loadするDSOに渡すみたいな感じでがよいかなと。 >>432
了解しましたー。
ぼちぼちで良いのでお待ちしてます。
乱立スレを見に行くか、、、 dsoとかなんとかで調子良くなるんなら
live15に入れて人大杉解除してくれよん >>435 設定情報は確かにそういうやり方の方がスマートかも知れませんね.
ただ,それなら今ある仕組みのままでも,SetEnv 使えば DSO プログラム側から
apr_table_get(r->subprocess_env, "key") で取り出せます.
一方,広告テキストなどはさすがに httpd.conf に書き連ねるのは......
ってことで,こちらはファイルから読み込んで server pool に突っ込んでおく
のが良さそうですね.だいたいこんな感じでしょうか.
----[read.h に追加]---------------------------------------------------
#include <pthread.h>
#include "apr_pools.h"
#include "apr_thread_rwlock.h"
----[read2ch.h に追加]------------------------------------------------
#define AD_FILENAME "ad.txt"
#define AD_CHECK_INTERVAL 60
----[read.c はこんな感じに]-------------------------------------------
:
typedef struct {
apr_thread_rwlock_t *rwlock;
volatile apr_time_t lastchecked, mtime;
apr_pool_t *pool;
apr_mmap_t *m;
} ad_pool_t;
:
static ad_pool_t *get_ad_pool(request_rec *r, const char *ad_key)
{
/* APR mutex には静的初期化マクロが用意されていないので,ここは pthread mutex を使用 */
static pthread_mutex_t ad_mutex = PTHREAD_MUTEX_INITIALIZER;
ad_pool_t *ad_pool, **ad_poolp = &ad_pool;
apr_pool_t *p = r->server->process->pool;
apr_pool_userdata_get((void **)ad_poolp, ad_key, p);
if (!ad_pool) {
pthread_mutex_lock(&ad_mutex);
apr_pool_userdata_get((void **)ad_poolp, ad_key, p);
if (!ad_pool) {
ad_pool = apr_palloc(p, sizeof *ad_pool);
ad_pool->lastchecked = ad_pool->mtime = 0;
if (apr_thread_rwlock_create(&ad_pool->rwlock, p)
|| apr_pool_create(&ad_pool->pool, p))
ad_pool = NULL;
else
apr_pool_userdata_set(ad_pool, ad_key, apr_pool_cleanup_null, p);
}
pthread_mutex_unlock(&ad_mutex);
}
return ad_pool;
} static void update_ad_pool(global_vars_t *gv, request_rec *r, ad_pool_t *ad_pool)
{
char *adfile;
apr_file_t *f;
apr_finfo_t finfo;
if (gv->t_now - ad_pool->lastchecked < AD_CHECK_INTERVAL * APR_USEC_PER_SEC)
return;
apr_thread_rwlock_wrlock(ad_pool->rwlock);
ad_pool->lastchecked = gv->t_now;
adfile = apr_pstrcat(r->pool, gv->cwd, "../", gv->zz_bs, "/", AD_FILENAME, NULL);
if (apr_stat(&finfo, adfile, APR_FINFO_MIN, r->pool)) {
ad_pool->mtime = 0;
apr_pool_clear(ad_pool->pool);
}
else if (finfo.mtime > ad_pool->mtime
&& gv->t_now - finfo.mtime >= APR_USEC_PER_SEC) {
apr_pool_clear(ad_pool->pool);
ad_pool->mtime = apr_file_open(&f, adfile, APR_READ, APR_OS_DEFAULT, r->pool)
|| apr_file_info_get(&finfo, APR_FINFO_MIN, f)
|| apr_mmap_create(&ad_pool->m, f, 0, finfo.size, APR_MMAP_READ, ad_pool->pool)
? 0 : finfo.mtime;
}
apr_thread_rwlock_unlock(ad_pool->rwlock);
}
:
int dso_main(request_rec *r, int argc, char **argv)
{
:
char *ad_key;
ad_pool_t *ad_pool;
:
ad_key = apr_pstrcat(r->pool, "read.ad.", gv->zz_bs, NULL);
ad_pool = get_ad_pool(r, ad_key);
if (ad_pool) {
update_ad_pool(gv, r, ad_pool);
apr_thread_rwlock_rdlock(ad_pool->rwlock);
if (ad_pool->mtime)
ap_rwrite(ad_pool->m->mm, ad_pool->m->size, r);
apr_thread_rwlock_unlock(ad_pool->rwlock);
}
:
}
---------------------------------------------------------------------- >>440
なるほど。毎回apr_stat()が走る点がちょっとだけ気になってみたけど、
べつに気にする必要ないかぁ。
あれ、Apache 2.0.xって汎用的なデータ共有リポジトリ的な
APIってなんかありませんでしたっけ?
いっそserver_poolじゃなくてapr_shm_create()あたり使っとけば、
workerモデルとpreforkモデル両方で、動的に情報をshareできて良いんじゃないかしら。
とか言い出してみるテスト。 >>442
>なるほど。毎回apr_stat()が走る点がちょっとだけ気になってみたけど、
ん〜と,http://qb5.2ch.net/test/read.cgi/operate/1101984763/620 の人が言っていたようなやり方なんですが.
if (gv->t_now - ad_pool->lastchecked < AD_CHECK_INTERVAL * APR_USEC_PER_SEC)
return;
で,インターバル期間内は stat もとらずに返してますから.
>あれ、Apache 2.0.xって汎用的なデータ共有リポジトリ的な
>APIってなんかありませんでしたっけ?
そうなんですか? まぁうまい仕組みがあればそれを使った方がいいのでしょうけど.
>いっそserver_poolじゃなくてapr_shm_create()あたり使っとけば、
>workerモデルとpreforkモデル両方で、動的に情報をshareできて良いんじゃないかしら。
これは,私が作った別のモジュール (mod_authz_iplist) でも検討したんですが,
APR ではインタープロセスな rwlock がサポートされてないので見送ってたんですが,
まぁ APR じゃなくて pthread のを使ってしまえばいいのかも知れません.
とりあえず FreeBSD ではサポートされてるようなので.
http://www.freebsd.org/cgi/man.cgi?query=pthread_rwlockattr_setpshared&manpath=FreeBSD+5.3-RELEASE+and+Ports ......と書いて思ったのだけど,>>440-441 のコードでも mmap() 使ってるんで
ファイルイメージは同一のものを共有してるんですよね.むしろ共有メモリ使っても
そこにファイル内容をコピーするとかでは mmap() 使う意味がなくなってしまうし. グローバルな変数の話しの続きですが (dso)
1) 普通に共有メモリを使ってやっても問題ない。
2) それならばdaemonを作っていろいろやらせて
read.cgi からは参照程度にしたほうが効率よい
という話しの流れっすよね?
■ このスレッドは過去ログ倉庫に格納されています