PHP Conference Japan 2024

PDO_SQLITE DSN

(PHP 5 >= 5.1.0, PHP 7, PECL PDO_SQLITE >= 0.2.0)

PDO_SQLITE DSN連線至 SQLite 資料庫

描述

PDO_SQLITE 資料來源名稱 (DSN) 由下列元素組成

DSN 前綴(SQLite 3)

DSN 前綴為 sqlite:

  • 若要存取磁碟上的資料庫,必須將絕對路徑附加到 DSN 前綴。

  • 若要在記憶體中建立資料庫,必須將 :memory: 附加到 DSN 前綴。

  • 如果 DSN 僅由 DSN 前綴組成,則會使用暫時資料庫,該資料庫會在連線關閉時刪除。

範例

範例 #1 PDO_SQLITE DSN 範例

以下範例顯示用於連線至 SQLite 資料庫的 PDO_SQLITE DSN

sqlite:/opt/databases/mydb.sq3
sqlite::memory:
sqlite:

新增註解

使用者貢獻的註解 5 則註解

26
frederic dot glorieux at diple dot net
13 年前
記憶體中的 sqlite 有一些限制。記憶體空間可以是請求、session,但似乎沒有任何文件記錄如何在使用者之間共享記憶體中的資料庫。

對於請求,請使用以下程式碼開啟您的資料庫
$pdo = new PDO( 'sqlite::memory:');
您的資料庫將在下一個請求時消失。

對於 session 持續性
<?php
$pdo
= new PDO(
'sqlite::memory:',
null,
null,
array(
PDO::ATTR_PERSISTENT => true)
);
?>
8
rick
18 年前
別忘了 "extension=php_pdo_sqlite.dll" 必須在 php.ini 中啟用 (如果您使用 xampp,預設會停用)。
8
Fatmoon
16 年前
看來包含您 sqlite 資料庫的目錄必須可供 Web 伺服器寫入。僅讓檔案可寫入是行不通的。
3
casteele at g-m-a-i-l ( dot ) c-o-m
8 年前
一些可能明顯也可能不明顯的注意事項。

一般來說,當從 PHP 腳本(例如 Web 伺服器的 index.php 檔案中的程式碼)使用記憶體中 (:memory:) 資料庫時,用於資料庫的記憶體僅在 PHP 程式碼執行期間存在。通常,這僅在將輸出傳遞回嘗試向用戶端提供網頁的 Web 伺服器時才會存在。沒有辦法(據我所知,如果我錯了請糾正我)在不同的 Web 連線之間共享記憶體中的資料庫,包括來自同一個用戶端的多個不同連線。*這確實包括「持續性」連線。* 這樣的原因是因為記憶體中的資料庫 *就是* 記憶體中的資料庫,並且 Web 伺服器/PHP 處理器配置和釋放的記憶體是「即時」的。否則,服務數千個網頁的 Web 伺服器將會快速耗盡所有可用記憶體(和交換空間),並且當系統不再有可用記憶體來處理更多請求時,將會停頓下來。

如果您需要在 session、連線或腳本之間共享資料,您需要使用 Web 伺服器/PHP 擴充功能可 *寫入* 的資料夾/目錄中的資料庫檔案,因為 SQLite3 在使用資料庫時可能會使用一些暫存檔。(在我的 Debian Linux 安裝中,這是 "www-data" 虛擬使用者/群組。)(如果您想知道它使用的暫存檔,可以參考 SQLite3 文件;它們有詳細的記錄。)

簡而言之,將記憶體中的資料庫視為非常短期的暫時資料庫是_邏輯_錯誤_。如果您只想在 *單一網頁內,並且僅在 PHP 腳本生成網頁時* 使用較大資料庫的子集,它們可能會很有用。也就是說,您不能使用記憶體中的資料庫來儲存使用者的「購物車」,例如,因為購物車仍然需要載入許多不同的網頁,調用許多不同的 PHP 腳本,每個腳本都有自己的記憶體空間。同樣,一旦 PHP 為伺服器生成要傳送給用戶端的網頁輸出,PHP 就不再是「畫面的一部分」,並且它已配置的任何記憶體都可以釋放以供其他用途 - 包括您的記憶體中資料庫。

這不是 Web 伺服器、PHP 或 SQLite 的限制,而是作業系統如何通常在處理程序/使用者/連線等等之間共享有限資源(例如記憶體)的方式。
5
FST777
16 年前
@ Fatmoon
這是正確的。SQLite 有時會在寫入資料庫時,在同一個資料夾中使用其他檔案。這些檔案有時可以看到,並且檔案名稱通常包含您資料庫的名稱和單字 "journal"。
就安全性而言,最好將 SQLite 資料庫儲存在單獨的資料夾中,以保護其餘部分免受使用者 www 的影響。
To Top