专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » couchdb:面向 PHP 开发人员的 CouchDB 基础知识 »正文

couchdb:面向 PHP 开发人员的 CouchDB 基础知识

来源: 发布时间:星期二, 2010年5月18日 浏览:1次 评论:0
  如果您是位典型 PHP 开发人员就不难通过以往项目得到这样个结论:在多数(如果不是全部)情况下为了进行动态数据处理您都会让 PHP 和数据库后端进行对话;而在这些例子中99% 情况下使用都是 MySQL

  如今使用关系型数据库无可厚非如果所处理数据结构复杂并具有多种关系那么这么做是很合理您可以顺利地(或是不太顺利地取决于您对 SQL 熟悉程度)进行对模式、数据关系、表等等处理

  不过您所从事项目有时也会让您不经意间心生疑问:“为什么我要做所有这些工作?” 您所从事这个项目包含了些简单或难以预测数据 — 在区别日子获得数据字段可能区别甚至事务的间数据字段都不尽相同若是创建个模式来预测将会出现什么数据字段结果很可能会得到内含大量空字段表或大量映射表

  常用缩略语

  Ajax:异步 JavaScript + XML

  API:应用编程接口

  GUID:全局惟标示符

  HTTP:超文本标记语言

  JSON:JavaScript 对象注释

  REST:具象状态传输

  SQL:结构化查询语言

  UUID:通用惟标识符

  对于这些项目您需要采用种区别方式 — 不涉及关系型数据库在这些情况下您需要个基于文档、没有模式、具有扁平地址空间特别数据库简言的您需要 Apache CouchDB

  什么是 CouchDB?

  CouchDB 是(根据 Apache CouchDB 网站WebSite):

  个文档数据库服务器可通过 RESTful JSON API 访问

  为特殊目而设计无模式具有扁平地址空间

  分布式、特性丰富、具备双向冲突检测及管理增量复制

  可查询、可索引、具有个面向表报表引擎使用 JavaScript 作为引擎查询语言

  这意味着您可以创建个能够接受 JSON 文档 CouchDB 数据库每个文档均有个惟修订 ID 和自身结构而且所有文档均存储于同个扁平集合内例如假设您设置了个简历集个简历具有字段包括:名、姓、电话号码、电子邮件地址、 Twitter 帐户、特长以及详细工作经历而第 2个简历则只有名、姓、电子邮件地址以及个简短工作经历这种差异足以使关系型数据库变得非常不适合但对于 CouchDB这点差异稀松平常

  简言的个 CouchDB 文档就是个由多个命名字段组成对象这些字段值可以是串、布尔值、数字、日期、顺序列表或关联映射清单 1 展示了个举例简历文档

清单 1. 个简单 CouchDB 文档

{ 
"Firstname": "Tom" 
"Lastname": "Myer" 
"Twitter": "@myerman" 
"Email": "[email protected]" 
"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 XCouchDB 安装过程十分简单:

  在 Linux 内安装

  您 developerWorks 编辑能够在他 Ubuntu Linux 笔记本上以如下两个步骤安装 CouchDB:

sudo apt-get  couchDB 
sudo /etc/init.d/couchdb start 


  此软件Software已经处于存储库内并会自然加载

  打开个 Terminal 窗口并键入 sudo port couchdb

  在系统提示后键入您根密码

  启动 MacPorts 来安装所需 CouchDB 包

  从 Terminal 窗口运行如下命令来检索最后分钟所做任何更改或依赖项:sudo port upgrade couchdb

  要使 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.htmlFuton 实用工具就会出现如图 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 GET 和 PUT 请求访问并返回 JSON 格式数据不管您使用是何种语言 — PHP、Microsoft Active Server Pages (ASP)、Ruby、Python 或更为简单 jQuery Ajax 这种设置都会使从 Web 应用存储和检索数据得到简化

  本节展示如何使用这个 cURL 命令行工具向 CouchDB 发出 GET、POST、PUT 和 DELETE 请求掌握了这个 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 属性来确认问题发生和否

  创建第 2个名为 foobar 数据库:

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

  如果运行 curl -X GET http://127.0.0.1:5984/_all_dbs结果会获得响应 ["songs","foobar"]为了去掉第 2个数据库可以向它传递个 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 =  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); 
} 
pr_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) { 
  ( $e->code  404 ) { 
 echo "Document not found\n"; 
 }  { 
 echo "Error: ".$e->getMessage." (errcode=".$e->getCode.")\n"; 
 } 
 exit(1); 
} 
pr_r($doc); 


  清单 6 给出了响应

清单 6. 检索到歌曲

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


  很不错但是如何对个文档进行更新呢?可以做更新有两种:更改现有字段值;添加新字段和新值对于后者可以使用箭头表示法(比如 $doc->_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 =  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); 
} 
pr_r($response); 




  结果应该类似清单 10

清单 10. 创建个新文档结果

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


  结束语

  至此您应该具备了开始使用 CouchDB 和 PHP 足够信息您也应该能够轻松创建您基本更新表单并能在日后创建或更新数据库内现有文档PHP-on-Couch 包还为您提供了创建和删除数据库以及使用 CouchDB 视图等其他思路方法总的本文有足够信息可以让您从开始就有个很好起点



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: