面向 PHP 開發人員的 CouchDB 基礎知識

來源:互聯網
上載者:User

 

 

Thomas Myer, 負責人, Triple Dog Dare Media

Thomas Myer 是一名顧問、作家和講師,居住在 Austin。他創立了 Triple Dog Dare Media 並在 Twitter 上以 @myerman 撰寫博文。

 

簡介: 作者 Thomas Myer 向資深 PHP 開發人員講述如何把 CouchDB 添加到他們的技術工具箱中。

 

 

如果您是位典型的 PHP 開發人員,就不難通過以往的項目得到這樣一個結論:在多數(如果不是全部)情況下,為了進行動態資料處理,您都會讓 PHP 與資料庫後端進行對話;而在這些執行個體中,99% 的情況下使用的都是 MySQL。

如今,使用關係型資料庫無可厚非。如果所處理的資料結構複雜,並具有多種關係,那麼這麼做是很合理的。您可以順利地(或是不太順利地,取決於您對 SQL 的熟悉程度)進行對模式、資料關係、表等等的處理。

不過,您所從事的項目有時也會讓您不經意間心生疑問:“為什麼我要做所有這些工作?” 您所從事的這個項目包含了一些簡單的或難以預測的資料 — 在不同的日子獲得的資料欄位可能不同甚至事務之間的資料欄位都不盡相同。若是建立一個模式來預測將會出現什麼資料欄位,結果很可能會得到內含大量空欄位的表或大量的映射表。

常用縮減語
  • Ajax:非同步 JavaScript + XML
  • API:API
  • GUID:全域惟一標示符
  • HTTP:超文字標記語言 (HTML)
  • JSON:JavaScript 對象注釋
  • REST:具象狀態傳輸
  • SQL:結構化查詢語言 (SQL)
  • UUID:通用惟一標識符

對於這些項目,您需要採用一種不同的方式 — 不涉及關係型資料庫。在這些情況下,您需要的是一個基於文檔的、沒有模式的、具有扁平地址空間的特別資料庫。簡言之,您需要 Apache CouchDB。

什麼是 CouchDB?

CouchDB 是(根據 Apache CouchDB 網站):

  • 一個文檔資料庫伺服器,可通過 RESTful JSON API 訪問。
  • 為特殊目的而設計,無模式,具有扁平地址空間。
  • 分布式的、特性豐富、具備雙向衝突檢測及管理的差異複寫。
  • 可查詢、可索引、具有一個面向表的報表引擎,使用 JavaScript 作為引擎的查詢語言。

這意味著,您可以建立一個能夠接受 JSON 文檔的 CouchDB 資料庫。每個文檔均有一個惟一的修訂 ID 和自身結構,而且所有文檔均儲存於同一個扁平的集合內。例如,假設您設定了一個簡曆集。第一個簡曆具有的欄位包括:名、姓、電話號碼、電子郵件地址、Twitter 帳戶、特長以及詳細的工作經曆。而第二個簡曆則只有名、姓、電子郵件地址以及一個簡短的工作經曆。這種差異足以使關係型資料庫變得非常不適合,但對於 CouchDB,這點差異稀鬆平常。

簡言之,一個 CouchDB 文檔就是一個由多個命名欄位組成的對象。這些欄位的值可以是字串、布爾值、數字、日期、順序列表或關聯映射。清單 1 展示了一個樣本簡曆文檔。

清單 1. 一個簡單的 CouchDB 文檔

{"Firstname": "Tom""Lastname": "Myer""Twitter": "@myerman""Email": "tom@example.com""Skills": ["php","couchdb","xml","json"]"Work History": ....}            

到目前為止,如果您習慣了使用 JSON,那麼不會覺得有太大出入。即便您不習慣,您仍然可以將此文檔對應成您所熟悉的東西,比如一個 PHP 數組。實際上,您可以將這些內建的 JSON encode/decode 函數用於 CouchDB,或者您也可以選擇一種更為物件導向的方式。

為了從一個集合查詢資訊,您可以通過 RESTful JSON API 使用各種便利的查詢方法。使用 JSON 簡化了很多問題。還有一點,作為一個熟悉 JavaScript、Ajax 和 JSON 的 Web 開發人員,您無需掌握 SQL 也能完成任務。

在繼續之前,最好暫停一下,先來著重強調幾點。CouchDB 不是一個關係型資料庫。這一點我可能早就說過了,但是它需要反覆強調。不要試圖以關係型資料庫的方式使用 CouchDB,比如插入 ID 欄位來協助理清文檔間的關係。與建立關係不同,您需要將想要的內容塞入到文檔,然後繼續。

此外,CouchDB 亦不是一個物件導向的資料庫。它不是什麼本機物件、持久資料層供您用作物件導向結構的基礎。千萬不要這麼認為。

回頁首

安裝 CouchDB

如果您使用的是 Mac OS X,CouchDB 的安裝過程十分簡單:

在 Linux 內安裝

您的 developerWorks 編輯能夠在他的 Ubuntu Linux 筆記本上以如下兩個步驟安裝 CouchDB:

sudo apt-get install couchDBsudo /etc/init.d/couchdb start

此軟體已經處於存放庫內並會自然載入。

  1. 開啟一個 Terminal 視窗並鍵入 sudo port install couchdb
  2. 在系統提示後,鍵入您的根密碼。
  3. 啟動 MacPorts 來安裝所需的 CouchDB 包。
  4. 從 Terminal 視窗,運行如下命令來檢索最後一分鐘所做的任何更改或依賴項:sudo port upgrade couchdb
  5. 要使 CouchDB 啟動起來並運行,在 Terminal 鍵入如下命令:
    sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist                        

    這會啟動 CouchDB 伺服器並保持它持續運行,所以只要重啟 Mac,它就會隨之啟動。

為了查看 CouchDB 的實際效果,在您的瀏覽器內鍵入 http://127.0.0.1:5984/_utils/index.html。Futon 工具 + 生產力就會出現, 1 所示。

圖 1. Futon 工具 + 生產力

在 Windows 系統上,過程將會有些複雜,因為您將需要先安裝 Microsoft C 編譯器 Cygwin、其他的一些前提條件(比如 cURL、ICU 和 SeaMonkey)、下載並安裝 Erlang 和 Couch 原始碼、根據 README 檔案對其進行配置,然後才能進行一次完整的安裝。這一過程在 CouchDB wiki(參見 參考資料)內有詳細的描述。您還將能夠找到針對 Linux、Berkeley Software Distribution (BSD) 和其他環境的指導。

回頁首

使用 CouchDB API

在進入 PHP 之前,最好是先對 CouchDB API 有些瞭解,此 API 可通過 HTTP GETPUT 請求訪問並返回 JSON 格式的資料。不管您使用的是何種語言 — PHP、Microsoft Active Server Pages (ASP)、Ruby、Python 或更為簡單的 jQuery Ajax 函數,這種設定都會使從 Web 應用程式儲存和檢索資料得到簡化。

本節展示如何使用這個 cURL 命令列工具向 CouchDB 發出 GETPOSTPUTDELETE 請求。掌握了這個 API 之後,就可以藉助一個特別的 PHP 封裝器簡化開發工作單位。

您首先需要啟動並執行(仍然是從 Terminal 視窗)是這個命令:curl http://127.0.0.1:5984/。隨後,應該會得到類似於 {"couchdb":"Welcome","version":"0.10.0"} 的一個響應。這隻是為了告訴您 CouchDB 已經啟動並運行以及所使用的是何版本。如果您沒有看到這個訊息,那麼就請重新進行安裝和配置直至 CouchDB 啟動並運行。

現在,嘗試列出在 CouchDB 內設定的所有集合。運行 curl -X GET http://127.0.0.1:5984/_all_dbs

如果 CouchDB 是初次安裝,應該會看到響應 [],這意味著沒有任何集合或資料庫(方括弧代表的是一個空的 JavaScript 數組)。請注意在這個 cURL 命令中,使用了 -X 選項來顯式指定一個 GET 操作。

現在,讓我們通過建立一個資料庫來解決該問題:

curl -X PUT http://127.0.0.1:5984/songs            

在運行上述命令後,會得到響應 {"ok":true}。現在您知道您可以查看 ok 屬性來確認成功與否。再次運行 curl -X GET http://127.0.0.1:5984/_all_dbs,結果會得到一個非空數組:["songs"]。並且,您的 CouchDB 執行個體內具有這樣一個資料庫:songs

現在嘗試建立另一個名為 songs 的資料庫。如果您再次運行 curl -X PUT http://127.0.0.1:5984/songs ,將會獲得一個如下所示的錯誤訊息:

{"error":"file_exists","reason":"The database could not be created,     the file already exists."}            

所以您可以很容易地查看 error 屬性來確認問題發生與否。

建立第二個名為 foobar 的資料庫:

curl -X PUT http://127.0.0.1:5984/foobar            

如果運行 curl -X GET http://127.0.0.1:5984/_all_dbs,結果會獲得響應 ["songs","foobar"]。為了去掉第二個資料庫,可以向它傳遞一個 DELETE 調用:

curl -X DELETE http://127.0.0.1:5984/foobar            

運行 curl -X GET http://127.0.0.1:5984/_all_dbs 表示您已經回至 ["songs"]

現在繼續,在 songs 資料庫內建立一些文檔。毋庸置疑,您想要在這個資料庫記憶體儲一些歌曲,這些歌曲具有曲名、藝人名稱和專輯名稱欄位。要建立一個文檔,遵循如下這個模式:

curl -X PUT http://127.0.0.1:5984/songs/*id* -d '{ *json_data* }'            

注意到先是調用資料庫的名稱,隨後是 ID(要求 ID 不僅要在這個 CouchDB 執行個體中惟一,而且還要盡量在所有執行個體中惟一),再後來是 JSON 資料。

如何獲得惟一 ID?可以使用一個 UUID(或一個 GUID)作為惟一 ID,或者也可以建立某種綜合了各種小塊資料的自然鍵(比如,歌曲名中用底線代替空格,再加上時間戳記),或者是讓 CouchDB 為您建立一個惟一 ID (這個過程很慢)。上述方式都不錯,只是不要像在 MySQL 環境內那樣使用自動增量的值。

現在,向您的資料庫內輸入一首歌曲:

curl -X PUT http://localhost:5984/songs/whatever_you_like -d /'{"title":"Whatever You Like", "artist":"T.I.","album":"Paper Trail"}'{"ok":true,"id":"whatever_you_like","rev":"1-1d915e4c209a2e47e5cf05594f9f951b"}            

請注意我對這個惟一 ID 採用了一個十分簡單的方式(使用了一個簡化了的歌曲名稱,用底線代替了空格)。這種簡單的方式對於目前的需要還能滿足。幸運的是,在 PHP 內將要使用的封裝器會協助您建立更好的 ID。也請注意我立即收到了一個 “ok” 響應,並且其中的文檔 ID 和 rev 屬性還告知了所設定的修訂版本。

要查看剛剛添加的這個文檔,可以嘗試:

curl -X GET http://localhost:5984/songs/whatever_you_like{"_id":"whatever_you_like","_rev":"1-1d915e4c209a2e47e5cf05594f9f951b", "title":"Whatever You Like", "artist":"T.I.", "album":"Paper Trail"}            

如果您一直在 Futon 內嘗試,應該能夠單擊這個歌曲資料庫名並在文檔列表內看到一個 whatever_you_like 項。單擊該連結會顯示所感興趣的這個文檔的詳細資料, 2 所示。

圖 2. 文檔詳細資料

您逐漸發覺 — 用 JSON 做出 RESTful 請求後就會有事情發生。

現在,所有這些看上去都很好,但是如果您是一名 PHP 開發人員,可能會疑惑如何將這些綜合在一起形成自己熟悉的東西呢。下一節會向您介紹面向 CouchDB 的 PHP 封裝器。

回頁首

使用 PHP

對於下一個步驟,您需要從 Github 下載 PHP-on-Couch(參見 參考資料)。將解壓縮了的 /lib 檔案夾內容放入您的開發地區。在設定好工作區域後,建立一個簡單的 PHP 應用程式來與已經設定好的這個 CouchDB 資料庫(您的歌曲集)對話。建立一個新檔案,然後將其命名為 index.php。並在其內放入清單 2 內的代碼。

清單 2. CouchDB 串連設定

<?php$couch_dsn = "http://localhost:5984/";$couch_db = "songs";require_once "./lib/couch.php";require_once "./lib/couchClient.php";require_once "./lib/couchDocument.php";$client = new couchClient($couch_dsn,$couch_db);?>            

上述代碼充當的是到 CouchDB 的串連代碼並且包含使用此資料庫所需的所有相關類。接著列出與資料庫相關的全部資訊,如清單 3 所示。

清單 3. 獲得資料庫資訊

try {$info = $client->getDatabaseInfos();} catch (Exception $e) {echo "Error:".$e->getMessage()." (errcode=".$e->getCode().")/n";exit(1);}print_r($info);            

得到的結果應該類似於清單 4。

清單 4. 資料庫資訊

stdClass Object ( [db_name] => songs [doc_count] => 2 [doc_del_count] => 0 [update_seq] => 2 [purge_seq] => 0 [compact_running] => [disk_size] => 8281 [instance_start_time] => 1266082749089965 [disk_format_version] => 4 )            

接下來,從歌曲資料庫中檢索一個文檔。清單 5 給出了所需代碼。

清單 5. 從資料庫中檢索一首歌

try {$doc = $client->getDoc('whatever_you_like');} catch (Exception $e) {if ( $e->code() == 404 ) {echo "Document not found/n";} else {echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")/n";}exit(1);}print_r($doc);            

清單 6 給出了響應。

清單 6. 檢索到的歌曲

stdClass Object(    [_id] => whatever_you_like    [_rev] => 1-1d915e4c209a2e47e5cf05594f9f951b    [title] => Whatever You Like    [artist] => T.I.    [album] => Paper Trail)            

很不錯,但是如何對一個文檔進行更新呢?可以做的更新有兩種:更改現有欄位值;添加新欄位和新值。對於後者,可以使用箭頭標記法(比如 $doc->new_field),然後通過 storeDoc() 儲存更改。清單 7 顯示了更新一個文檔所需的代碼。

清單 7. 更新一個文檔

$doc->genre = 'hip-hop';$doc->year = 2008;try {        $response = $client->storeDoc($doc);} catch (Exception $e) {        echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")/n";        exit(1);}            

運行此代碼,然後就可以檢索這個文檔 ID 並獲得清單 8 內所示的結果。

清單 8. 更新後的文檔

stdClass Object(    [_id] => whatever_you_like    [_rev] => 2-12513a362693b300928aa45f82faed83    [title] => Whatever You Like    [artist] => T.I.    [album] => Paper Trail    [genre] => hip-hop    [year] => 2008)            

注意到 _rev 屬性已經從之前的 1-whatever 增加為 2-whatever。藉此,就可以很容易地判斷已經發生了更改。

那麼,該如何在資料庫記憶體儲一個新文檔呢?您可以執行個體化一個新對象並使用箭頭標記法來填充文檔內的欄位。清單 9 顯示了所需代碼。

清單 9. 建立一個新文檔

$song = new stdClass();$song->_id = "in_the_meantime";$song->title = "In the Meantime";$song->album = "Resident Alien";$song->artist = "Space Hog";$song->genre = "Alternative";$song->year = 1995;try {$response = $client->storeDoc($song);} catch (Exception $e) {echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")/n";exit(1);}print_r($response);            

結果應該類似清單 10。

清單 10. 建立一個新文檔的結果

stdClass Object(    [ok] => 1    [id] => in_the_meantime    [rev] => 1-d65b03a9fe2f3c8095b08883e7cd97df)            

回頁首

結束語

至此,您應該具備了開始使用 CouchDB 和 PHP 的足夠資訊。您也應該能夠輕鬆建立您的基本更新表單並能在日後建立或更新資料庫內的現有文檔。PHP-on-Couch 包還為您提供了建立和刪除資料庫以及使用 CouchDB 視圖等的其他方法。總之,本文有足夠資訊可以讓您從開始就有一個很好的起點。

參考資料

學習

  • 訪問 CouchDB 項目網站。
  • CouchDB: The Definitive Guide 是 CouchDB 權威指南的一個免費線上版本。
  • 查閱 CouchDB wiki 尋找有關 CouchDB 疑問的答案。
  • 閱讀 Installing CouchDB on Windows 獲得在 Windows 平台上安裝資料庫的指導。
  • 訪問 Installing CouchDB on Linux/BSD 獲得在運行 Linux 或 BSD 的電腦上安裝資料庫的指導。
  • 參閱 The CouchDB API Reference 瞭解本文使用的這個 API 的更多資訊。
  • 閱讀 “探索 CouchDB” 瞭解 CouchDB 緣何如此突出。
  • PHP.net 是面向 PHP 開發人員的中心資源。
  • 查閱 “推薦 PHP 讀物列表”
  • 瀏覽 developerWorks 上的所有 PHP 內容。
  • 用 IBM developerWorks 的 PHP 項目資源 提高您的 PHP 技巧。
  • 要收聽針對軟體開發人員的有趣訪談和討論,請訪問 developerWorks podcasts。
  • 要將資料庫與 PHP 結合使用?查看 Zend Core for IBM,它是一個無縫的、可以立即使用、易於安裝、支援 IBM DB2 V9 的 PHP 開發和生產環境。
  • My developerWorks 涵蓋了大量主題,是一個成功社區的典範。
  • 隨時關注 developerWorks 技術活動和網路廣播。
  • 查閱最近將在全球舉辦的面向 IBM 開放源碼開發人員的研討會、交易展覽、網路廣播和其他 活動。
  • 訪問 developerWorks Open source 專區獲得豐富的 how-to 資訊、工具和項目更新以及最受歡迎的文章和教程,協助您用開放源碼技術進行開發,並將它們與 IBM 產品結合使用。
  • 查看免費的 developerWorks 示範中心 觀看並瞭解 IBM 及開源技術和產品功能。

獲得產品和技術

  • 從 Github 下載 PHP-on-Couch 庫。
  • 使用 IBM 產品評估試用版軟體 改進您的下一個開發項目,這些軟體可以通過下載獲得。
  • 下載 IBM 產品評估試用版軟體 或 IBM SOA Sandbox for People 並開始使用來自 DB2、Lotus、Rational、Tivoli 和 WebSphere 的應用程式開發工具和中介軟體產品。

 

 

文章來源:http://www.ibm.com/developerworks/cn/opensource/os-php-couchdb/index.html

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.