2017-06-02 2 views
0

Ich habe gelesen, dass WAL-Modus ermöglicht einem Benutzer Benutzer während einer Schreibsitzung zu lesen.
Daher sollte ich in der Lage sein, 3 Sitzungen zu haben, die Daten und eine schreibende Daten gleichzeitig lesen. Das klingt nach einer guten Sache für meinen Gebrauch, also dachte ich, ich sollte den Sitzungstyp definieren, damit das System weiß, ob diese Sitzung ein Leser ist oder ein Schreiber, der das Verbindungsflag verwendet.
http://php.net/manual/en/sqlite3.open.php#refsect1-sqlite3.open-parameters
Darin heißt es hier, dass, wenn die Sitzung nicht sauber geschlossen wird, dass die -shm und -wal Dateien werden trotz nicht entfernt
https://www.sqlite.org/tempfiles.html#write_ahead_log_wal_files
Nach einer Lesesitzung damit die temporären Dateien nicht entfernt werden, wurde die Sitzung bedeutet nicht sauber geschlossen Aufruf der Close-Funktion und Rückgabe true, also warum werden die Dateien nicht gelöscht, wenn die SQLITE3_OPEN_READONLY Flag verwenden? Sollte ich überhaupt eine Flagge benutzen?PHP SQLite PRAGMA journal_mode = wal und readonly Benutzer

+0

Bitte lesen Sie die [aktuelle Dokumentation] (http://www.sqlite.org/wal.html#readonly). –

+0

Ich habe das gelesen, es ist nicht auf readonly Medien –

+0

Die Medien selbst spielt keine Rolle, "Schreibzugriff ist erforderlich". –

Antwort

1

Sie haben SQLites Konzept von "Lesern" und "Schreibern" mit der Fähigkeit des PHP SQLite3-Treibers in Verbindung gebracht, eine Datei schreibgeschützt zu öffnen.

die SQLITE3_OPEN_READONLY Flag verwenden wird PHP führen alle Operationen mit einer Warnung schreiben zu blockieren:

Warnung: SQLite3 :: exec(): Versuch, eine Nur-Lese-Datenbank in ...

zu schreiben

Dies kann nützlich sein, wenn Sie sicherstellen möchten, dass keine Schreibvorgänge von Ihrer Anwendung aus vorgenommen werden können (möglicherweise als Sicherheitsmaßnahme). Aber es bezieht sich nicht auf die Leser und Autoren von SQLite.

Als pointed out by CL benötigen alle Prozesse, die auf die WAL-Modus-Datenbank zugreifen, Schreibzugriff. Dies ist ausdrücklich documented:

Auch wenn mehrere Prozesse sind eine WAL-Modus-Datenbank zugreifen zu können, dann werden alle Prozesse unter Benutzer oder Gruppen-IDs ausgeführt werden soll, die ihnen den Zugang zu den Datenbankdateien schreiben geben, die WAL-Datei, die geteilt Speicher -shm-Datei und das enthaltende Verzeichnis.

Und als Nachteil an der Spitze dieser Seite erwähnt:

Es ist nicht möglich schreibgeschützten Datenbanken WAL zu öffnen. Der Eröffnungsvorgang muss Schreibberechtigungen für die gemeinsam genutzte Speicherdatei "-shm" wal-index haben, wenn diese Datei vorhanden ist, oder den Schreibzugriff auf das Verzeichnis mit der Datenbankdatei, wenn die Datei "-shm" nicht existiert.

SQLite selbst entscheidet, ob ein Prozess ein Leser oder Schreiber ist, wenn er einen auszuführenden Befehl empfängt. Zum Beispiel, wenn ein einzelner Prozess eine SELECT ausführt, dann eine INSERT, dann eine SELECT erneut es wechselt vom Leser zum Schreiber zum Leser. SQLite kümmert sich automatisch um die Sperrung (die möglicherweise andere Prozesse blockiert). (Beachten Sie, dass dies eine vereinfachte Erklärung ist, die bei verschiedenen Modi des Datenbankbetriebs sehr unterschiedlich sein kann.)

Für Ihre Zwecke sollten Sie nicht das SQLITE3_OPEN_READONLY Flag verwenden.

Verwandte Themen