Windows does not support locking the database. You may use $_ENV to determine the OS:
$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
(PHP 4, PHP 5, PHP 7, PHP 8)
dba_open — Abre um banco de dados
$path
,$mode
,$handler
= null
,$permission
= 0644,$map_size
= 0,$flags
= null
dba_open() estabelece uma instância de banco de dados para
o arquivo especificado em path
no modo definido por mode
usando
o manipulador informado em handler
.
path
Normalmente um caminho comum no seu sistema de arquivos.
mode
Define os modos: r
para acesso de leitura, w
para
acesso de leitura/gravação a um baco de dados já existente, c
para leitura/gravação e criação de banco de dados se ainda não existir,
e n
para criar, truncar e acesso leitura/gravação.
O banco de dados é criado modo de árvore binária (BTree), outros modos (como Hash or Queue)
não são suportados.
Além disso, pode ser definido o método de trava do banco de dados com o próximo caractere.
Use l
para travar o banco de dados com um arquivo .lck
ou d
para travar o próprio arquivo de banco de dados. É
importante que todas as aplicações façam isso de forma consistente.
Se a intenção for testar o acesso e não esperar pela trava,
pode-se adicionar t
como terceiro caractere. Quando
houver certeza absoluta de que não é necessário travar o banco de dados,
pode-se fazê-lo usando -
em vez de l
ou
d
. Quando nenhum dos caracteres d
,
l
ou -
forem usados, o DBA irá travar
o arquivo de banco de dados como faria com d
.
Nota:
Só pode haver um gravador para um arquivo de banco de dados. Quando um DBA é usados em um servidor web e mais de uma solicitação requerer operações de gravação, elas só poderão ser feitas uma após a outra. Também não será permitido ler durante a gravação. A extensão DBA usa travas para evitar isso. Veja a tabela a seguir:
Travas DBA já aberto mode
= "rl"mode
= "rlt"mode
= "wl"mode
= "wlt"mode
= "rd"mode
= "rdt"mode
= "wd"mode
= "wdt"não aberto ok ok ok ok ok ok ok ok mode
= "rl"ok ok espera falso ilegal ilegal ilegal ilegal mode
= "wl"espera falso espera falso ilegal ilegal ilegal ilegal mode
= "rd"ilegal ilegal ilegal ilegal ok ok espera falso mode
= "wd"ilegal ilegal ilegal ilegal espera falso espera falso
- ok: a segunda chamada será bem sucedida.
- espera: a segunda chamada espera até que dba_close() seja chamada para a primeira.
- falso: a segunda chamada retorna falso.
- ilegal: não se deve misturar os modificadores
"l"
e"d"
no parâmetromode
.
handler
O nome do manipulador que
deve ser usado para acessar o arquivo definido em path
. São passados
todos os parâmetros opcionais fornecidos para dba_open() e
pode agir em nome deles. Se handler
for null
,
o manipulador padrão será invocado.
permission
Parâmetro opcional int que é passado ao driver. Tem o mesmo significado que
o parâmetro permissions
de chmod() (*nix)
e o padrão é 0644
.
Os drivers db1
, db2
, db3
,
db4
, dbm
, gdbm
,
ndbm
e lmdb
suportam o
parâmetro permission
.
map_size
Parâmetro opcional int que é passado ao driver. Seu valor deve ser um múltiplo do tamanho da página do sistema operacional, ou zero, para usar o tamanho padrão do mapa.
Somente o driver lmdb
aceita o parâmetro map_size
.
flags
Opções a serem passadas aos drivers de banco de dados. Se for null
, as opções padrão serão passadas.
Atualmente, apenas o driver LMDB suporta as opções
DBA_LMDB_USE_SUB_DIR
e
DBA_LMDB_NO_SUB_DIR
.
Retorna uma instância de Dba\Connection em caso de sucesso ou false
em caso de falha.
false
é retornado e um erro de nível E_WARNING
é emitido quando
handler
for null
mas não houver manipulador padrão.
Versão | Descrição |
---|---|
8.4.0 | Retorna agora uma instância de Dba\Connection; anteriormente, retornava um resource. |
8.2.0 |
flags foi adicionado.
|
8.2.0 |
handler agora pode ser nulo.
|
7.3.14, 7.4.2 |
O driver lmdb agora suporta o parâmetro adicional
map_size .
|
Windows does not support locking the database. You may use $_ENV to determine the OS:
$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
Apache doesn't support Berkeley DB Btree, so you can't manipulate use db4 as the type of database if you want to do DBM authentication with Apache.
gdbm seemed to work fine though, even though it supposedly using Btree instead of hash. It makes you wonder why Apache would use hash for one dbmtype versus btree for another.
So since Apache and PHP don't have options to choose the method for the Berkeley DBs, you are out of luck.
As of GDBM version 1.8.3, GDBM's underlying open call uses non-blocking calls to flock() on systems that have flock(). As a result, calls with "rd" or "wd" locking modes will return error ("Can't be reader" or "Can't be writer") instead of waiting. Use "rl" or "wl" instead, to make PHP do its own locking external to GDBM.
If you get some strange errors like
dba_open(): myDbFilename.db : Permission denied
than you are propably using PHP on a Windoze machine. You have to make sure that the following conditions are met:
1) Use an absolute path to your db file. Relative paths will cause problems with locking
2) Specify a locking mode - that's the second character of the mode-argument, or else opening a dba-file will cause several notices/warnings etc.
And a final, general note:
3) Always use the english PHP doc on this site - the translations are often old as hell and miss important informations
HTH, Nils.
Here's a simple example to use the dba_open function
<?php
$id = dba_open("/tmp/test.db", "n", "gdbm");
if (!$id) {
echo "dba_open failed\n";
exit;
}
dba_replace("key", "This is an example!", $id);
if (dba_exists("key", $id)) {
echo dba_fetch("key", $id);
dba_delete("key", $id);
}
dba_close($id);
?>
Note the “c” create flag does not work if MySQL was built with the “cdb” DBA handler compile option which is common for many distros. By definition the cdb DBA handler is optimized for reading/writing and “no updates are allowed.”
<?php
$dbh = dba_open( "./data2/productz", "c", "cdb") or die( "Couldn't open Database" );
?>
instead use
<?php
$dbh = dba_open( "./data2/productz", "n", "cdb" ) or die( "Couldnt open Database" );
?>
generates this error message in the /var/log/apache2/error.log:
[Sun Sep 06 04:18:15 2009] [error] [client 192.168.1.125] PHP Warning: dba_open(./data2/productz,c) [<a href='function.dba-open'>function.dba-open</a>]: Driver initialization failed for handler: cdb: Update operations are not supported in /var/www/projects/testcdb-c.php on line 43
see user contributed comment under dba_handlers() to see which DBA handlers are supported by your build of MySQL and note about using “cdb” compiled DBA systems:
also see user contributed comment under dba_replace() about incompatibilities with cdb DBA handler compiled MySQL systems.