DBM。
今日のテーマは DBM。
調べてみたら、PHPで使えるようなんで
よくわからんけど素直にWindows 用拡張モジュールのインストールに従い
ローカル上のWindows版phpの php.ini 中の…
extension=php_dba.dll
…とコメントアウトをはずした次第。
それから、phpinfo() してみた結果、
dba の「Supported handlers」には…
cdb cdb_make db3 inifile flatfile
…と書いてあって、本番サーバーの方でも…
gdbm dbm ndbm cdb cdb_make inifile flatfile
…との事だったので、どっちも使えるcdbを使ってみたものの。
なんか書き込めたんだか、書き込めたのに読み込めないんだか
訳わからん動きしかしてくれない(^^;
そしたら、
「PHP-TECH」のPHP逆引きリファレンスでも
同じような事がちょこっと書かれていたので、cdbは断念し、
しょうがないので、適当に flatfile を使って成功。
って訳で、一番下に書いたようなクラスを作って
DBMを管理する方向で調整中ー。
Berkeley DB 覚書き for C,Java,Perl,Ruby
サンプルスクリプトがいっぱいだー。
perlモジュール。Data::Dumperより容量が少なくて済むらしいので興味津々。
上記のモジュールをPHPに移植したらしい。
PHP::Session - PHPセッションファイルの読み書き for perl
perl用モジュールでありながら、
PHPとのセッションと共有出来るらしい。すんばらしい。
str_repeat関数 for PHP
文字列を反復する関数。ガーンそんな関数標準であったのか。
Unterstützte Dateitypen by geocities.de
ドイツ版ジオシティーズでアップ可能なファイル形式一覧
アップロードできるファイルの種類 by geocities.jp
日本版ジオシティーズでアップ可能なファイル形式一覧
クラス
<?
class DBA {
var $err = "";
var $con = "";
var $file = "";
var $handler = "";
function DBA( $file, $handler = "flatfile" ) {
$this->file = $file;
$this->handler = $handler;
}
function open( $mode ) {
$this->err = "";
if ( !$this->con = dba_open( $this->file, $mode, $this->handler ) ) {
$this->err = "接続に失敗しました";
return false;
}
return true;
}
function optimize() {
if ( dba_optimize( $this->con ) === false ) {
$this->err = "最適化に失敗しました";
return false;
}
return true;
}
function close() {
dba_close( $this->con );
return true;
}
function put( $param ) {
$this->err = "";
if ( $this->open( "n" ) === false ) return false;
foreach( $param as $key => $value ) {
$value = gzcompress( serialize( $value ) );
if ( dba_replace( $key, $value, $this->con ) === false ) {
$this->err = $key."の書き込みに失敗しました";
$this->close();
return false;
}
}
if ( $this->optimize() === false ) return false;
$this->close();
if ( chmod( $this->file, 0744 ) === false ) {
$this->err = $file."のファイルモード変更に失敗しました";
return false;
}
return true;
}
function get() {
$this->err = "";
if ( $this->open( "r" ) === false ) return false;
$key = dba_firstkey( $this->con );
while ( $key != false ) {
$param[$key] = unserialize( gzuncompress( dba_fetch( $key, $this->con ) ) );
$key = dba_nextkey( $this->con );
}
$this->close();
return $param;
}
function delete( $key ) {
$this->err = "";
if ( $this->open( "w" ) === false ) return false;
if ( dba_delete( $key, $this->con ) === false ) {
$this->close();
$this->err = $key."の削除に失敗しました";
return false;
}
if ( $this->optimize() === false ) return false;
$this->close();
return true;
}
function destruct() {
unset( $this );
return true;
}
}
?>
そのクラスを使う側
<?
// インクルード
require_once( "./common/cp_dba.php" );
// DBファイルの在り処
define( DBA_DB_FILE_PATH, "./test.db" );
// DBに保存するデータ
$param['20050502'] = array( "update" => time(), "title" => "タイトル1", "text" => "テキスト1" );
$param['20050503'] = array( "update" => time(), "title" => "タイトル2", "text" => "テキスト2" );
// インスタンス
$objDBA = new DBA( DBA_DB_FILE_PATH );
// DBに保存
if ( !$objDBA->put( $param ) ) {
echo $objDBA->err;
exit;
}
// DBから値を取得
if ( !$param = $objDBA->get() ) {
echo $objDBA->err;
exit;
}
// DBの値を削除
if ( !$objDBA->delete( "20050503" ) ) {
echo $objDBA->err;
exit;
}
$objDBA->destruct();
// サンプルで出力
echo nl2br( print_r( $param, true ) );
echo $param['20050502']['title'];
?>