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 open mode = "rl" mode = "rlt" mode = "wl" mode = "wlt" mode = "rd" mode = "rdt" mode = "wd" mode = "wdt" not open ok ok ok ok ok ok ok ok mode = "rl" ok ok wait false illegal illegal illegal illegal mode = "wl" wait false wait false illegal illegal illegal illegal mode = "rd" illegal illegal illegal illegal ok ok wait false mode = "wd" illegal illegal illegal illegal wait false wait false
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()も参照ください。