Base de données verrouillée lors de l'accès à partir d'un script PHP
Je suis en train d'écrire une application Android qui communique avec un PHP backend. Le backend db SQLite 3. Le problème est que j'obtiens cette erreur par intermittence PHP Warning: SQLite3::prepare(): Unable to prepare statement: 5, database is locked
. Je vais ouvrir une connexion à la base de données dans chaque fichier PHP et de le fermer lorsque le script se termine. Je pense que le problème est que l'un script verrouillé le fichier de base de données lors de l'écriture et le second script a été d'essayer d'y accéder, ce qui a échoué. Une façon d'éviter cela serait de partager une connexion entre tous les scripts php. Je me demandais si il n'y a aucun autre moyen d'éviter cela?
Edit:
C'est le premier fichier:
<?php
$first = SQLite3::escapeString($_GET['first']);
$last = SQLite3::escapeString($_GET['last']);
$user = SQLite3::escapeString($_GET['user']);
$db = new SQLite3("database.db");
$insert = $db->prepare('INSERT INTO users VALUES(NULL,:user,:first,:last, 0 ,datetime())');
$insert->bindParam(':user', $user, SQLITE3_TEXT);
$insert->bindParam(':first', $first, SQLITE3_TEXT);
$insert->bindParam(':last', $last, SQLITE3_TEXT);
$insert->execute();
?>
Ici est le deuxième fichier:
<?php
$user = SQLite3::escapeString($_GET['user']);
$db = new SQLite3("database.db");
$checkquery = $db->prepare('SELECT allowed FROM users WHERE username=:user');
$checkquery->bindParam(':user', $user, SQLITE3_TEXT);
$results = $checkquery->execute();
$row = $results->fetchArray(SQLITE3_ASSOC);
print(json_encode($row['allowed']));
?>
- Tout d'abord partager le Code
- Ajout de code et plus de description
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, lorsque vous avez terminé avec une ressource, vous devez toujours fermer. En théorie, il sera fermé lorsque c'est le garbage collector, mais vous ne pouvez pas dépendre de PHP le faire tout de suite. J'ai vu un peu les bases de données (et d'autres types de bibliothèques, d'ailleurs) se bloquer parce que je n'ai pas explicitement de libérer des ressources.
Deuxième, Sqlite3 vous donne une longue expiration. Je ne suis pas sûr de ce que le défaut est, mais si vous êtes prêt à attendre quelques secondes pour verrouiller effacer lorsque vous exécutez des requêtes, vous pouvez le dire. Le délai d'attente est exprimée en millisecondes.
busyTimeout
. Ça fonctionne très bien maintenant. Merci!J'ai été faire "de la base de données verrouillée" tout le temps que j'ai découvert certaines fonctionnalités de sqlite3 doit être définie à l'aide de SQL instructions spéciales (c'est à dire à l'aide de PRAGMA mot-clé). Par exemple, ce qui est apparemment résolu mon problème avec la base de données "verrouillé" était de mettre en journal_mode de " wal "(c'est la valeur par défaut "supprimer", comme indiqué ici: https://www.sqlite.org/wal.html (voir Activation Et la Configuration de WAL Mode)).
Donc, fondamentalement, ce que j'avais à faire était de créer une connexion à la base de données et le réglage de journal_mode avec l'instruction SQL. Exemple:
Espère que ça aide.