dba_open

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

dba_open -- データベースをオープンする

説明

resource dba_open ( string path, string mode, string handler [, ...] )

dba_open()は、handlerを用いて modeを指定し、path への データベースインスタンスを生成します。

pathは、ファイルシステムの通常のパスです。

modeには、既存のデータベースにアクセスする 際に読み込みアクセス用に "r"、読込み/書き込みアクセス用に"w"を、 読み込み/書き込みアクセスおよび存在しない場合にデータベースの作成をする ために"c"を、作成、上書き、読込み/書き込みアクセス用に "n" を指定 します。さらに次の文字でデータベースをロックする方法を指定することができます。 .lckでデータベースをロックする場合には"l"、 データベースファイル自体をロックする場合は"d"を使用してください。 全てのアプリケーションで統一した方法を用いることが重要です。 アクセスのテストを行う際にロックのために待ちたくない場合、"t"を3番目の文字に追加する ことができます。明らかにデータベースのロックが不要な場合には、"l"や"d"の代わりに "-"を使用してロックを行わないことができます。 "d"、"l"または"-"のどれも指定されない場合、"d"が指定されたものとして データベースファイルをロックします。

handler は、 ハンドラ名で、 pathをアクセスする際に使用することができます。 このハンドラには、dba_open() に指定した全てのオプション パラメータが渡され、そのオプションの機能を用いることができます。

dba_open() は、オープンに成功した場合に正の ハンドラID、失敗した場合にFALSEを返します。

注意: 特定のデータベースファイルに同時に書き込めるのは、一つだけです。 dbaをWebサーバで使用している際に複数のリクエストが書き込み処理を 行う必要がある場合、他の書き込みが終わってからでないと次の書き込みを行うことが できません。また、書き込み時に読み込むことはできません。 dbaエクステンションは、このようなことを防止するためにロックを使用します。 以下の表を参照してください:

表 1. DBAのロック処理

already openmode = "rl"mode = "rlt"mode = "wl"mode = "wlt"mode = "rd"mode = "rdt"mode = "wd"mode = "wdt"
not openokokokokokokokok
mode = "rl"okokwaitfalseillegalillegalillegalillegal
mode = "wl"waitfalsewaitfalseillegalillegalillegalillegal
mode = "rd"illegalillegalillegalillegalokokwaitfalse
mode = "wd"illegalillegalillegalillegalwaitfalsewaitfalse

ok: 2番目のコールに成功します。
wait: 2番目のコールは、最初のコールでdba_close()がコールされるまで待ちます。
false: 2番目のコールは、falseを返します。
illegal: modeパラメータで"l" および "d" 修正子を混用することはできません。

注意: PHP 4.3.0以降、ネットワーク接続されたデータベースファイルをオープンすることができます。 しかし、(httpまたはftpのような)ソケット接続が使用された場合、リソース自体ではなくこの接続が ロックされます。このような場合、このリソースに関してロック処理は単に無視されることになり、 他の解決策を見付ける必要があることに留意する必要があります。

注意: ロック処理とmode修正子 "l", "d", "-" および "t" は、 PHP 4.3.0で追加されました。 PHP 4.3.0より前のバージョンのPHPでは、 GDBMを除くデータベースハンドラで 同時データベースアクセスに対する保護を行うためには、セマフォを使用する必要がありました。 System V セマフォサポートを参照してください。

注意: PHP 4.3.5までは、オープンモード'c'は、いくつかの内部ハンドラでは正常に動作せず、 既存のデータベースにデータを追加するのではなく、データベースを切り捨ててしまっていました。 また、dbm と ndbm は典型的な設定でモード'c'の処理が正常に動作しません。 (これは修正できません)

dba_popen()dba_close()も参照ください。