实战派带你玩真正的大数据,14周高强度特训!

锋云网

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
锋云网 首页 开发实战 查看内容

PHP云计算实战:使用 Zend Framework 将数据移入和移出云

2010-11-9 18:38| 发布者: cloud| 查看: 8952| 评论: 1|原作者: Doug Tidwell|来自: developerWorks 中国

摘要: Zend Framework 包含了一些类,可以简化基于云的存储服务的使用。本文将解释如何将这些类应用于 Amazon 的 S3 云存储服务。

云计算承诺为用户和应用程序提供不受限制的磁盘空间。在理想的世界中,访问这类存储将和访问本地硬盘一样简便。不幸的是,大多数云存储服务的基本 API 要求程序员考虑协议和配置细节,而不是简单地处理数据。本文将探查 Zend Framework 中的类,它们将使 Amazon 的 S3 云存储服务变成一个真正无限大的硬盘。

连接格式和云计算

构建在云中使用的应用程序的主要挑战就是与服务本身的接口。大多数服务提供了 REST 或 SOAP 接口(S3 同时提供了两者)。REST 的主要优势就是它不是特定于语言的。这意味着您可以从所喜欢的任意编程语言中调用服务。劣势就是在使用 REST 或 SOAP 时,您必须考虑请求的细节问题,而不是关心您要使用的数据。举个例子,所有发送给 S3 的请求都必须包含一个由您的 Amazon 访问密匙和签名值组成的身份验证令牌。这表示您的请求必须包含这样一个值:0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

显然,让您能够专注于数据而不是签名和其他细节的更高级的方法可以带来显著的生产力改进。这就是 Zend_Service_Amazon_S3 类发挥作用的地方。该类允许您关注数据,而不是关注 HTTP 头部结构、SOAP 信封或其他无关细节。

入门

如果您还没有安装 Zend Framework,那么请从 zend.com/community/downloads 下载并安装完整的包。该包将在您的机器上安装 Zend Framework、PHP 和 Apache Web 服务器。完成安装后,请访问 http://localhost/ZendServer/。参考 Zend Framework 安装文档获得所有细节。如果可以登录到 ZendServer 控制台,那么您就准备就绪了。

要执行本文后面介绍的练习,您需要在 Amazon 中建立一个帐户(参见 参考资料 获得帐户管理页面的链接)。建立好帐户后,需要对您的凭证进行管理。Amazon 为您提供了一个访问密匙和秘密密匙。在使用 S3 时,您的 PHP 页面需要这些值。管理这些信息的一种方法就是将这些值放到您的代码里。


清单 1. 在 PHP 代码中存储凭证
				
// Credentials for Amazon - Don't do this!

$awsKey = "0123456789ABCDEFGHIJ";
$awsSecret = "0123456789abcdefghiABCDEFGHI1234567890AB";

这种方法是有效的,但是您必须将代码放入到每一个有需要的 PHP 文件中。更好的做法是将这些值放入到一个 PHP .ini 文件,该文件类似清单 2 所示。


清单 2. 在 PHP .ini 文件中存储凭证
				
; Configuration file to hold secret keys, account numbers and other useful
; strings for Amazon and other cloud accounts.

[amazon]
accessKey=0123456789ABCDEFGHIJ
secretKey=0123456789abcdefghiABCDEFGHI1234567890AB
ownerId=123456789012

[nirvanix]
username=jane_doe
password=XXXXXXXX
appKey=01234567-89ab-cdef-0123-456789abcdef
            

一个简单的 PHP 类可以轻松地处理这些值。


清单 3. 用于检索凭证的简单 PHP 类
				
key_array = parse_ini_file("..\conf\cloud.ini", true);
  }

  function getCredential($group, $key) {
    return $this->key_array[$group][$key];
  }
}
?>

该类使用 PHP parse_ini_file() 函数读取 .ini 文件格式的值。此函数的第一个参数为文件的名称,第二个参数告诉 PHP 将文件解析为不同的部分。这意味着数组 $key_array 是一个 2-D 数组。数组键为第一维的 amazon 和 nirvanix,以及第二维的accessKeysecretKeyappKey 等。Credentials 类提供了 getCredential() 方法来从 .ini 文件检索值。与将凭证硬编码到每一个 PHP 文件相反,我们将对示例使用类似如下所示的代码:


清单 4. 创建和使用一个 Credentials 对象
				
getCredential('amazon', 'accessKey'),
                                 $creds->getCredential('amazon', 'secretKey'));

使用这种方法需要花多一点时间来设置您的代码,但是一旦完成了此项工作,您就在一个位置一次性地定义了您的凭证。如果需要修改它们,您就不必在每个 PHP 文件中进行修改。

需要注意几点:

  • 注意 .ini 文件并不在 Web 服务器的文档根中。它位于 conf 目录,这是与文档根同级别的目录。考虑到一些显而易见的原因,您并不希望将凭证文件放到某个可被未授权用户访问的位置。
  • 另一方面,本文的所有 PHP 文件都存储 在 Web 服务器的文档根中。
  • 记住,.ini 文件中的注释以一个分号开头;PHP 样式的注释是无效的。

关于样例应用程序

作为首批被称为云计算的服务的一员,Amazon 的 S3 是一个提供了不受限在线存储的分布式文件系统。S3 数据模型包含两个概念:bucket 和对象。bucket 可以包含无限多个对象,每个对象包含数据和元数据。一个 bucket 不能包含另一个 bucket。在创建 bucket 时,bucket 的名称必须在所有 S3 用户中是惟一的。对象一旦创建以后,只能被替换或删除;您不能对其进行修改。当创建一个对象时,可以对其设置访问控制参数。默认情况下,对象是私有的,但是如果您愿意的话,也可以将其共享。

我们的样例应用程序是一个基于 Web 的面向 S3 的文件管理器。通过使用 Zend_Service_Amazon_S3 类,您可以创建能够完成以下操作的 PHP 页面:




  • 查看您的 S3 帐户中的所有 bucket
  • 创建新的 bucket
  • 查看 bucket 中的所有对象
  • 创建新对象
  • 删除一个对象
  • 删除一个 bucket

应用程序被编写为两个 PHP 文件:s3.php 和 bucketlist.php。s3.php 文件显示帐户中的所有 bucket,并允许您创建新的 bucket 和删除已有 bucket。bucketlist.php 文件显示给定 bucket 中的所有对象。它允许您创建新的对象并删除已有对象。bucketlist.php 文件显示有关每个对象的元数据并提供 Amazon 中的对象的直接链接。(如您所料,如果您无权访问该对象,就会得到一条错误消息)。

创建一个 Zend_Service_ Amazon_S3 对象

如您所料,第一步是创建一个 Zend_Service_Amazon_S3 对象。构造器函数包含两个参数:您的 Amazon 访问密匙和秘密密匙。使用前面讨论的 Credentials 类。


清单 5. 创建一个 Zend_Service_Amazon_S3 对象
				getCredential('amazon', 'accessKey'),
                                 $creds->getCredential('amazon', 'secretKey'));
                                 ?>

两个 PHP 文件都以这几行代码开头。不管您是查找 bucket 还是查找对象,这里创建的 $s3 对象将完成大部分工作。

列出 S3 帐户中的所有 bucket

当用户加载 s3.php 时,他将看到其 Amazon 帐户中的所有 bucket 的清单。屏幕布局十分直观。


图 1. 帐户中的 buckets 的列表
帐户中的 buckets 的列表 

getBuckets() 方法返回一组 bucket 名称。每个 bucket 名称被格式化为一个链接;单击链接将把用户带到 bucketlist.php 页面。每个 bucket 名称旁边有一个 Delete 按钮,该按钮允许用户完整地删除该 bucket。(处理 bucket 删除的代码将在稍后讨论)。下面展示了表行是如何生成的。


清单 6. 创建 bucket 列表
				

Here are your buckets:

$list = $s3->getBuckets(); foreach($list as $bucket) { echo ""; } ?>
 $bucket"; echo ""; $contents = $s3->getObjectsByBucket($bucket); if (count($contents)) { echo "
"; echo ""; } else { echo ""; } echo ""; echo ""; echo "

注意,链接将 bucket 名称传递给 bucketlist.php 文件。

创建一个新的 bucket

创建新 bucket 有一些麻烦,因为 Amazon 对 bucket 名称有一些限制:

  • bucket 名称必须在 3 到 63 个字符之间。
  • 只能够包含小写字母、数字、句点和小横线。早期版本的 S3 允许在 bucket 名称中使用下划线。如果您访问的是早期的 S3 帐户,那么很可能会发现某些 bucket 命名违背了这一原则。
  • 必须以数字或字母开头
  • 不能是 IP 地址(10.14.14.107 是不允许的)。
  • 不能使用小横线结尾。
  • 不能在句点的旁边使用小横线(doug-.tidwell 是不允许的)。

Zend_Service_Amazon_S3 类提供了一个名为 _validBucketName() 的方法,它对 bucket 名称执行一定程度的检验。不幸的是,此方法的代码没有与最新的 Amazon 命名约定同步。bucket 名称可能会通过 _validBucketName() 测试,但是它在请求发向 Amazon 时仍然会失败。

新 bucket 名称的表单非常简单。


清单 7. 创建新 bucket 的表单
				

Create a new bucket

action="" method="post">

Enter a name for your new bucket:



A bucket name can contain only lowercase letters, periods and dashes,
it should start with a letter or digit, and it can't be an IP address.



注意表单将新的 bucket 名称提交给它本身。单击 Create bucket 按钮将使 PHP 文件通过新的 bucket 名称调用其自身。


图 2. 创建新 bucket 的表单
创建新 bucket 的表单 

用于创建新 bucket 的 PHP 代码将检查名称是否有效。如果该名称通过由 Zend_Service_Amazon_S3 类提供的测试,那么代码将调用createBucket() 方法。非零响应代码意味着 bucket 已被成功创建;0 表示 bucket 已经存在。任何更为严重的错误将被作为异常抛出,并尽可能优雅地处理。

12下一页

鲜花

握手

雷人

路过

鸡蛋

相关阅读

发表评论

最新评论

引用 锋云帮主 2010-11-11 06:14
需要使用Zend Framework 框架

查看全部评论(1)

在线咨询|关于锋云|联系我们|手机版|投诉建议|版权声明|云计算|Hadoop|大数据|锋云网 ( 京ICP备13050990号 )

这是云计算时代的精英部落,这是中国最大的云计算社区 —— 锋云网(sharpcloud.cn)!

本站CDN/存储服务由本站CDN/存储服务由又拍云提供提供

Powered by Discuz! X3.2

© 2001-2015 Sharpcloud.cn

 

锋云网官方QQ群

中国云计算精英群(ID:64924638)中国云计算精英群      Hadoop技术交流群②(ID:25728812)Hadoop技术交流群②      Spark技术交流群(ID:413581066)Spark技术交流群

Hadoop技术交流群(ID:113156288,2000人群已满)

返回顶部