dat on SQL
- by 221氏
- http://nanacahaha.com/news4vip/
- ↑の【規制】Perl PHP C出来るやつちょっと来い【解除】にてソース配布中。
同スレの142より
ライセンスは0 0 1aはクリエイティブコモンズ帰属 - 同一条件許諾~あたりでゆるゆると。
http://creativecommons.org/licenses/by-sa/2.1/jp/
src0_0_1 非公式ドキュメント
- by 2:246氏
- last-modified 05/10/17 21:50
- 動作まで
- PHP+MySQL+サーバをインストール。これは検索すればいくらでも出てくるので省略。MySQL Administratorを入れておくと非常に便利なので入れることをオススメする。
- php.iniを開いて、
;extension=php_mbstring.dll
;extension=php_mysql.dll
のセミコロンを外す。 - PHPのルートディレクトリに入り、その下のextraディレクトリからphp_mysql.dll及びphp_mbstring.dllを持ち出し、PHPルートディレクトリに移動する。
- mysql.exe等を実行し、一番下に落ちてる「作成用スクリプト」を2行目から実行する。
- ドキュメントルートあたりにtestディレクトリを作成し、解凍した各スクリプトを置く。以下はドキュメントルート下に作成したものとする。
- bbs.cgiと同一のフォルダにdatフォルダを作成する。
- すべてのファイルの "nanacahaha.com" を "localhost" に置換する。htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。。
- すべてのファイルの $mysql_dbname="" を $mysql_dbname="news4vip" に置換する。
- 必要があれば、indexMaker.php 及び datMaker.php で "/var/www/html/" を "../" などに置換する。
- 必要があれば、bbs.cgi で "/dat/" を "./dat/" などに置換する。
- PHPのバージョンによっては、read.cgiの75行目付近を以下のように変更する必要がある。(10/17追記)
$query = getenv ("PATH_INFO");
↓
if (isset($_SERVER["PATH_INFO"])) {
$query = $_SERVER["PATH_INFO"];
} else if (isset($_SERVER["ORIG_PATH_INFO"])) {
$query = $_SERVER["ORIG_PATH_INFO"];
} - indexMaker.php の47行目付近及び81行目付近を以下のように変更する。
47 :
if($modify > $last_modify) → if(!$last_modify=="" && $modify > $last_modify){
81-83 :
fwrite($file,"<a id=\"${i}\"></a><div style=\"border:2px solid gray;width:90%;text-align:left;\" >");
$sql = "SELECT res FROM `counter` WHERE serial=${key[$i]}";
$result = mysql_query($sql,$link);}
↓
$sql = "SELECT res FROM `counter` WHERE serial=${key[$i]}";
$result = mysql_query($sql,$link);
if (!$result) { continue; }
fwrite($file,"<a id=\"${i}\"></a><div style=\"border:2px solid gray;width:90%;text-align:left;\" >"); - indexMaker.phpを実行 ( http://localhost/test/indexMaker.php を開くなど) し、http://localhost/test/index.html を開く。
- あとはスレ立て・カキコが自由にできる。但し、書き込み後index.htmlに戻っても更新されていない。(bbs.cgi稼動と同時に)更新させたい場合は、375行目付近の「if($load){」の次の行に「require("indexMaker.php");」を挿入する。
- なお、bbs.cgi稼動時に「filesize」関数の警告が出るが無視して構わない。どうしても見たくない場合は、284行目付近を以下のように変更する。
$size = filesize("./dat/${id0}/${id1}/${id2}/${key_pad}.dat");
if($size >= 512 * 1024){
↓
if(file_exists("./dat/${id0}/${id1}/${id2}/${key_pad}.dat") && filesize("./dat/${id0}/${id1}/${id2}/${key_pad}.dat") >= 512 * 1024){ - 開発中、デバッグ中に整合性がなくなるなど面倒なことになったら、どうせ公開してないんだしDBを再作成すればいい。mysqliを使えばautocommitが設定できるのだが…
- テーブル図
221先生のsql.txtを基に作成。
DB上ではスレキーはhtmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。、レス番はhtmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。と言う名前になる。
主キーは黄色下線、キーは下線緑、その他は緑で表記した。
221先生より、「インデックス引きは速度的に超重要」「参照回数が多いのはMyISAMよりHEAPに」「再帰同時は別ソフトで再計算すべき」との有難いお言葉を頂きました。
subject(MyISAM)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
subject TINYBLOB |
modify DATETIME |
last_modify DATETIME |
現行のsubject.txtに当たる。sage書き込みの場合はmodifyが更新されず、last_modifyのみ更新される。
keytable(MyISAM)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 DATE |
keyrand VARCHAR(200) |
ID生成用のテーブルを提供する。
その日の一番初めの書き込みでID用ランダム文字列を挿入し、以後その日は同じ文字列を使用する。
その日の一番初めの書き込みでID用ランダム文字列を挿入し、以後その日は同じ文字列を使用する。
counter(HEAP)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
res INT(6) |
レス数のテーブル。
res(MyISAM)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(6) |
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 DATETIME |
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 VARCHAR(16) |
subject TINYBLOB |
res BLOB |
from TINYBLOB |
mail TINYBLOB |
実際の書き込みを格納するテーブル。
timeがDATETIMEにならない事もありうる(吉野家コピペ暦X年、等)ので、変更される可能性アリ?
timeがDATETIMEにならない事もありうる(吉野家コピペ暦X年、等)ので、変更される可能性アリ?
ipdat(MyISAM)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(6) |
ip VARCHAR(20) |
IPアドレスを格納するテーブル。
status(HEAP)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
modify DATETIME |
現在調査中。code:0はsubback/subject/index作成時刻を入れて、subjectテーブルが変更された時のみ
indexMaker.phpが動作するようになっているらしいが…?
indexMaker.phpが動作するようになっているらしいが…?
subject_back(HEAP)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
subject TINYBLOB |
現在調査中。過去ログ作成時に使用?
subject_back(HEAP)
htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。 INT(10) |
現在調査中。過去ログ作成時に使用?
- datについて
bbs.cgiでは、datファイルの作成も行っている。datファイルは、例えば0123456789.datの場合はdatroot/012/345/6/0123456789.datに格納される。
よって、1つのフォルダが持つ最大のdat数は1000個である。
2chの専用ブラウザと互換性を持たせるために、bbsname/dat/xxxxxxxxxx.datにアクセスされたら
mod_rewriteにより本来格納されているファイルを返すようになっている。
現在、datの名前はSQLのAUTO_INCREMENTを使ってスレごとに1ずつ加算されるようになっているが、
本来(現行体制)はUNIX時間が使われている。これについては、「一部専用ブラウザではdat名をスレッドが立った時間と判定している」との意見もあるが、
UNIX時間を使うと「1秒に複数のスレッドを立てることができない」と言う問題もある。
- 各ファイルの役割
- read.cgi
- 言わずと知れたread.cgiのPHP版。resテーブルを読み、HTMLとして出力する。
- bbs.cgi
- 言わずと知れたbbs.cgiのPHP版。スレ立て、レス書き共にこれが担当する。ファイル、データベースの双方に出力を行う。
- indexMaker.php
- index.html、subback.html、subject.txtをデータベースから作成する。
- datMaker.php
- 過去ログ作成機。詳しく目を通してないんでわからない (´Д`;)
- 作成用スクリプト
http://nanacahaha.com/sql.txt.tar.gzよりどうぞ。
↑の前に↓を実行すると初心者は幸せかも。
DROP DATABASE news4vip; CREATE DATABASE news4vip; USE news4vip;
そして最後に↓を実行すると幸せかも。
GRANT ALL ON * TO ODBC; INSERT INTO `status` VALUES(0,19000001);
- MySQL テーブル作成用スクリプト
CREATE TABLE `counter` ( `serial` int(10) NOT NULL default '0', `res` int(6) NOT NULL default '0', PRIMARY KEY (`serial`) ) TYPE=HEAP; CREATE TABLE `ipdat` ( `serial` int(10) NOT NULL default '0', `sub_serial` int(6) NOT NULL default '0', `ipaddr` varchar(20) NOT NULL default '', PRIMARY KEY (`serial`,`sub_serial`) ) TYPE=MyISAM; CREATE TABLE `keyTable` ( `keydate` date NOT NULL default '0000-00-00', `keyrand` varchar(200) NOT NULL default '', PRIMARY KEY (`keydate`) ) TYPE=MyISAM; CREATE TABLE `res` ( `serial` int(10) NOT NULL default '0', `sub_serial` int(6) NOT NULL default '0', `modify_time` datetime NOT NULL default '0000-00-00 00:00:00', `subject` tinyblob NOT NULL, `res` blob NOT NULL, `FROM` tinyblob, `MAIL` tinyblob, `idkey` varchar(16) default NULL, `idkey` varchar(16) default NULL, PRIMARY KEY (`serial`,`sub_serial`), KEY `modify_time` (`modify_time`), KEY `idkey` (`idkey`) ) TYPE=MyISAM; CREATE TABLE `status` ( `code` int(10) NOT NULL default '0', `modify` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`code`) ) TYPE=HEAP; CREATE TABLE `subject` ( `serial` int(10) NOT NULL auto_increment, `subject` tinyblob NOT NULL, `last_modify` datetime NOT NULL default '0000-00-00 00:00:00', `modify` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`serial`), KEY `last_modify` (`last_modify`), KEY `modify` (`modify`) ) TYPE=MyISAM AUTO_INCREMENT=96 ; CREATE TABLE `subject_back` ( `serial` int(10) NOT NULL default '0', `subject` tinyblob NOT NULL, PRIMARY KEY (`serial`) ) TYPE=MyISAM; CREATE TABLE `subject_reconst` ( `serial` int(10) NOT NULL default '0', PRIMARY KEY (`serial`) ) TYPE=HEAP;
負荷条件 毎秒1スレッド立て 毎秒100スレ書き込み 3000スレアクティブ 過去ログ1つに10000個
の条件でも、SQLなら大ジョブということで。チューニング0だから、チューニングすれば速くなるし、マシンも遅いしね。
さっきまでかけていた自動負荷ツールとめたので、あとは誰かが書き込まない限り、動かないと思う。
自動的に落ちていく様が見たいーというひとはこえかけるか砲撃でもしてくれ
150,000スレ以上1日で作ったけどしても特に問題ないしapacheのモジュールでメモリ管理よりかはSQLの方がいいんじゃない?
という一つのテーゼに対する回答としてはこんなもので十分じゃないかね。
1日でディスク容量数Gつぶしたけどね・・・