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 — Ouvre une base de données DBA
$path
,$mode
,$handler
= null
,$permission
= 0644,$map_size
= 0,$flags
= null
dba_open() établit une connexion à
la base identifiée par path
avec le
mode mode
et l'identifiant
handler
.
path
Chemin sur votre système de fichiers.
mode
Il vaut r
pour lecture seule, w
pour
lecture/écriture, c
pour lecture/écriture, et
création si la base n'existe pas, et n
pour
création, écrasement et accès en lecture/écriture.
La base de données est créée en mode BTree ; les autres modes (comme Hash ou
Queue) ne sont pas supportés.
De plus, vous pouvez choisir la méthode de verrouillage de la base avec le
caractère suivant. Utilisez l
pour verrouiller la base avec un
fichier .lck, ou d
pour verrouiller
la base elle-même. Il est important que vos application utilisent ces
options de manière cohérente.
Si vous voulez tester la possibilité d'accès, et ne pas attendre la
disponibilité du verrou, vous pouvez ajouter la lettre t
comme troisième caractère. Lorsque vous êtes absolument certain que votre base
ne requière pas de verrou, vous pouvez utiliser le tiret -
à la place de l
ou d
.
Lorsque vous n'utilisez ni d
, ni l
ni
-
, dba va verrouiller en mode d
.
Note:
Il ne peut y avoir qu'un seul type d'écriture dans la base. Lorsque vous utilisez dba sur un serveur web, et que plusieurs requêtes HTTP effectuent des écritures, elles ne peuvent être faites que l'une après l'autre. De même, la lecture durant l'écriture n'est pas possible. L'extension dba utilise un verrou pour éviter ces problèmes. Voici la table de verrouillage :
Verrouillage DBA déjà ouverte mode
= "rl"mode
= "rlt"mode
= "wl"mode
= "wlt"mode
= "rd"mode
= "rdt"mode
= "wd"mode
= "wdt"non-ouverte ok ok ok ok ok ok ok ok mode
= "rl"ok ok attente false
illégal illégal illégal illégal mode
= "wl"attente false
attente false
illégal illégal illégal illégal mode
= "rd"illégal illégal illégal illégal ok ok attente false
mode
= "wd"illégal illégal illégal illégal attente false
attente false
- ok: Le second appel réussit.
- wait: Le second appel attend que dba_close() soit appelé par le premier script.
- false: Le second appel retourne
false
.- illégal: vous ne devez pas mélanger les options
"l"
et"d"
pour le paramètremode
.
handler
Le nom du gestionnaire
qui doit être utilisé pour accéder à path
.
C'est passé à tous les paramètres facultatifs donnés à
dba_open() et peut agir au nom d'eux.
Si le paramètre handler
est null
,
alors le gestionnaire par défaut est invoqué.
permission
Paramètre facultatif de type entier qui est passé au pilote. Il a la même signification que
le paramètre permissions
de la fonction chmod(),
et a une valeur par défaut de 0644
.
Les pilotes db1
, db2
,
db3
, db4
, dbm
,
gdbm
,
Les pilotes ndbm
et lmdb
prennent en charge le
paramètre permission
.
Le pilote lmdb
supporte deux paramètres additionels.
Le premier permet de définir le $filemode
(voir description ci-dessus), et le second permet de définir la
$mapsize
, dont la valeur devrait être un multiple de
la taille de page du système d'exploitation, ou zéro pour utiliser la
mapsize par défaut.
La paramètre $mapsize
est supporté à partir de
PHP 7.3.14 et 7.4.2, respectivement.
map_size
Paramètre facultatif de type entier qui est passé au pilote. Sa valeur doit être un multiple de la taille de page du système d'exploitation, ou zéro pour utiliser la taille de mappage par défaut.
Seul le pilote lmdb
accepte le paramètre map_size
.
flags
Drapeaux à passer aux pilotes de base de données. Si null
, les drapeaux par défaut seront fournis.
Actuellement, seul le pilote LMDB prend en charge les drapeaux suivants :
DBA_LMDB_USE_SUB_DIR
et
DBA_LMDB_NO_SUB_DIR
.
false
est retourné et une erreur de niveau E_WARNING
est émise lorsque
le paramètre handler
est null
, mais qu'aucun gestionnaire par défaut n'est disponible.
Retourne une instance Dba\Connection en cas de succès ou false
si une erreur survient.
Version | Description |
---|---|
8.4.0 | Retourne désormais une instance de Dba\Connection; auparavant, une ressource était retournée. |
8.2.0 |
Le paramètre flags est ajouté.
|
8.2.0 |
Le paramètre handler est désormais nullable.
|
7.3.14, 7.4.2 |
Le pilote lmdb supporte désormais un paramètre
additionel 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.