PHP Conference Nagoya 2025

dba_open

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_openAbre um banco de dados

Descrição

dba_open(
    string $path,
    string $mode,
    ?string $handler = null,
    int $permission = 0644,
    int $map_size = 0,
    ?int $flags = null
): Dba\Connection|false

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.

Parâmetros

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âmetro mode.

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.

Valor Retornado

Retorna uma instância de Dba\Connection em caso de sucesso ou false em caso de falha.

Erros/Exceções

false é retornado e um erro de nível E_WARNING é emitido quando handler for null mas não houver manipulador padrão.

Registro de Alterações

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.

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 6 notes

up
1
doppelbauer at gmail dot com
18 years ago
Windows does not support locking the database. You may use $_ENV to determine the OS:

$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
up
0
dracoirs at gmail dot com
14 years ago
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.
up
0
mskala at ansuz dot sooke dot bc dot ca
16 years ago
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.
up
0
xy ät affenkrieger.de
18 years ago
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.
up
-2
trohit at blue bottle dot com
17 years ago
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);
?>
up
-5
cbemerine at gmail dot com
15 years ago
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.
To Top