Amazon 的 SQS 提供了音讯排队系统的根本功用。虽然 SQS 不是设计用来取代企业级别的音讯系统的,但它确实具有诸多有用特征。本文着眼于 Zend Framework 内的一些能够简化 SQS 内音讯处置的办法。
立刻开端
在本文中,您将看到如何运用 Simple Queue Service 完成多个首要职务。与本系列的其他文章一样,假设能在开端之前装置好 Zend Framework 将会让您能够从我们给出的这些示例中获益最多。假设尚未装置,可先从 Zend.com下载并装置整个包。Zend Framework、PHP 和 Apache Web 服务器就会一并装置好。装置完成后,访问 http://localhost/ZendServer/。有关详细,请参考 Zend Framework 装置文档。若能登录到这个 ZendServer 控制台,那标明预备就绪。
此外,能够还须要设立一个 Amazon帐户。
本文中的这些例子运用 运用 PHP 完成云计算,第 1 局部:结合运用 Amazon S3 和 Zend Framework 内创立的 PHP Credentials 类。该类担任维护您的 Amazon 帐号的凭证。这些凭证均存储于 .ini 文件内:
清单 1. 在 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 延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
SQS 只运用您的访问钥和密钥。您无需知晓您自己的 ID,但是您自己的 ID 在您创立音讯队列时会成为队列的一局部。
有关示例使用顺序
本文中的示例使用顺序包含一个单一的 PHP 页面(sqs.php),它可执行多个功用:
列出一个帐户内的一切音讯队列,包含每个队列中的音讯数目
创立一个音讯队列
创立一个音讯并将其放入一个队列
从一个给定队列接纳一条音讯
删除一个己接纳音讯
删除一个音讯队列以及其内的一切音讯
为了立刻开端,先来创立一个 Zend_Service_Amazon_Sqs 对象。
清单 2. 创立一个 Zend_Service_Amazon_Sqs 对象
require_once 'Zend/Service/Amazon/Sqs.php';
require_once 'Credentials.php';
$creds = new Credentials;
$sqs = new Zend_Service_Amazon_Sqs($creds->getCredential('amazon',
'accessKey'), $creds->getCredential('amazon', 'secretKey')); 这个对象让您能够处置与您的帐户有关联的队列。Zend_Service_Amazon_Sqs->getQueues() 办法会前往由属于您帐户的一切队列名组成的一个数组。这个 PHP 页以表的方式显示了这些队列名:
图 1. 列出 SQS 队列
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片1](/Files/BeyondPic/2010-6/22/106222344599484.jpeg)
音讯队列名中包含您帐户的一切者 ID。在本例中,这些队列属于的一切者 ID 为 123456789012。在访问一个队列或音讯时,必需运用完全限定的队列名(http://queue.amazonaws.com/ownerId/queueName)。这里的表可见局部还包含了每个队列中可见音讯的数目。PHP 代码如下所示:
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
清单 3. 获得队列列表及每个队列内所含音讯数目
$queues = $sqs->getQueues();
foreach ($queues as $queue) {
try {
$messageCount = $sqs->count($queue);
echo "<tr>";
echo "<td>".$queue."</td>";
echo "<td style='text-align: center;'>".$messageCount."</td>"; 上述代码运用 count() 办法来获得每个队列内所含音讯数目。(更精确地说是音讯的大致数目;稍后对此会细致引见。)假设队列中至少有一个音讯,PHP 就会创立一个按钮来接纳文本音讯;否则,此单元格为空(参见图 2)。
清单 4. 创立一个按钮来接纳文本音讯
echo "<td>";
if ($messageCount) {
echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>";
echo "<input type='hidden' name='getNextMessage' value='1'>";
echo "<input type='hidden' name='queueToUse' value='$queue'/>";
echo "<input type='submit' value='Receive Next Message'>";
echo "</form>";
}
else
echo " ";
echo "</td>"; 表每行的结尾一个单元格会创立一个按钮,用来删除此队列及其内所含音讯。完壁的队列表如图 2 所示。
图 2. 完壁的队列表
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片2](/Files/BeyondPic/2010-6/22/1062223445937276.jpeg)
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
在这个屏幕截图中,有三个队列。其中包含音讯的两个队列显示了 “Receive Next Message” 按钮。表的每行都具有一个 “Delete Queue” 按钮,用以删除某个队列。
创立一个队列
创立一个队列十分容易。只需获得队列名并调用 Zend_Service_Amazon_Sqs->create() 办法。PHP 页包含了一个容易的表单,用以输进一个队列名:
图 3. 创立一个队列
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片3](/Files/BeyondPic/2010-6/22/1062223445935791.jpeg)
创立一个新队列的代码也很直观。
清单 5. 创立一个队列
try {
$responseCode = $sqs->create($_POST['queueToCreate']);
if ($responseCode)
echo "The queue ".$_POST['queueToCreate']." was created successfully.";
. . .
}
catch (Zend_Service_Amazon_SQS_Exception $sqse) {
echo "The queue could not be created. The error message from Amazon is:";
echo "<br/><br/><i>".$sqse->getMessage()."</i>";
} Zend 没有为 create() 办法提供任何特殊的错误处置,所以若发作任何错误,代码只会容易地将异常的细致信息写至页面。若试图创立一个具有不合法称号(比如 queue#3)的队列,会前往异常 InvalidParameterValue,若试图创立一个具有反复称号的队列,则会前往 QueueAlreadyExists。当队列成功创立后,页面就会显示一个成功音讯。
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
清单 4. 队列创立成功
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片4](/Files/BeyondPic/2010-6/22/1062223450081486.jpeg)
创立一个音讯
这个 PHP 页面还包含了一个冗长的表单,用以创立音讯。
图 5. 创立一个音讯
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片5](/Files/BeyondPic/2010-6/22/1062223450026417.jpeg)
请留意这个下拉列表曾经被您帐户内的队列名填充。
图 6. 列出您帐户内的一切队列
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片6](/Files/BeyondPic/2010-6/22/1062223450030647.jpeg)
构建这个下拉列表的 PHP 代码如清单 6 所示。
清单 6. 创立一个用来挑选队列的下拉列表
<p>Select a queue:</p>
<select name="queueForNewMessage">
<?php
foreach ($queues as $queue) {
echo "<option>".$queue."</option>";
}
?>
</select>
</code> 创立一个新队列的代码中运用了 send() 办法。
清单 7. 将一个音讯发送到一个队列
try {
$response = $sqs->send($_POST['queueForNewMessage'], $_POST['newMessage']);
if ($response) {
echo "The new message was sUCcessfully created in queue ";
echo $_POST['queueForNewMessage'];
echo ".<br/>The message ID is ".$response.".";
}
else {
echo "The new message could not be created in queue ";
echo $_POST['queueForNewMessage'];
echo ".";
}
}
catch (Zend_Service_Amazon_SQS_Exception $sqse) {
echo "The message could not be created. The error message from Amazon is:";
echo "<br/><br/><i>".$sqse->getMessage()."</i>";
} 延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
上述代码向 Amazon 发送了一个央求。假设在创立音讯时发作任何疑问,页面就会显示异常。在大非少数情况下,页面都会显示被成功创立音讯的 ID。
图 7. 成功创立的音讯
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片7](/Files/BeyondPic/2010-6/22/1062223450032638.jpeg)
成功音讯包含新音讯的 ID。在接纳音讯时,还会再次看到这个音讯 ID。
有关传达延迟
在像 SQS 这样的散布系统内存在的一个疑问是传达延迟。出于功用和牢靠性的思索,非少数云提供商会将您的信息的多个副本分散到他们的网络。这种设计的积极的一面是假设某个机器宕机,您的信息仍存在于网络的其他地点。这种方式的消极的一面是要想将对您信息的修改贯彻到整个网络须要破费大量时间。这种延迟被称为传达延迟。若您装置了本文中开发的这个示例使用顺序,就会留意到传达延迟的成效。
在创立一个队列时,若 PHP 页面显示一个成功音讯,标明此队列被成功创立。页面上还会显示一个表,列出您帐户内的一切队列。由 SQS 前往的这个队列列表通常包含您刚刚创立的这个队列。但是,假设您创立一个音讯,几乎能够完全必须,这个队列表不会显示音讯的精确数目,由于音讯的创立还没有反映到这个队列。比如,有一个具有三个音讯的队列,若在其中再创立一个新的音讯,由 SQS 前往的数据将会通知您音讯被成功创立,并且队列中只需三个音讯。
为了处置这种延迟,页面包含了一个用来刷新队列列表的按钮。
图 8. 刷新队列列表
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片8](/Files/BeyondPic/2010-6/22/1062223450049667.jpeg)
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
假设单击这个按钮来刷新队列,此表将会包含音讯的精确数目。(这个刷新按钮准许用户更新此表,而无需重新提交创立音讯的央求。)关于这里的这个示例使用顺序,在删除一个队列时,传达延迟就能够成为一个疑问。虽然 SQS 会报告它成功删除了队列,但是其称号还经常会显示在列表内。若此时讯问 SQS 该队列内的音讯数目,将会获得一个异常。出于这个原由,用来生成队列列表的代码运用了一个 try 块来获得队列内音讯的数目。假设对 count() 办法的调用失败,代码将容易疏忽这个异常。
为了有效运用 SQS,须要牢记传达延迟这一要素。这一点也适用于许多其他的云服务。
接纳一个音讯
对队列内的音讯的处置普通须要两个步骤:接纳和删除。接纳到音讯后,Amazon SQS 会将该音讯标为不可见。音讯应由您来处置,所以能访问此队列的任何人都不会看到该音讯。在接纳到音讯后,在一段时间内删除这个音讯也应由您担任。每个队列都应该定义一个可见性超时;假设您没有在该时间内删除此音讯,此音讯会再次成为可见的并可由任何人处置。当前,队列的默容许见性超时普通是 30 秒。
在创立队列时,Amazon 准许为一切被处置的音讯定义可见性超时。Zend Framework 支持 Zend_Service_Amazon_Sqs->create() 办法的第二个参数,以便定义可见性超时。
清单 8. 为一个队列定义可见性超时
$responseCode = $sqs->create($_POST['queueToCreate'], 120); 在本例中,可见性超时是 2 分钟。
从一个队列接纳音讯是由 Zend_Service_Amazon_Sqs->receive() 办法完成的。音讯队列的称号从表单传递进来。由于音讯最多能够有 8K 个字符长,因而它被显示在一个 Html <textarea> 控件内。接纳到的音讯具有四个局部:
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
body:音讯本身的文本
音讯体的 md5 摘要
message_id:音讯的唯一标识符
handle:从队列删除音讯必需运用的标识符
用以上给出的数组键,能够访问音讯的这四个局部。比如,能够运用 $message[0]['body'] 来获得音讯的主体,用 $message[0]['handle'] 前往音讯的句柄。请留意虽然 Amazon SQS 准许一次央求多个音讯,Zend Framework 却不准许。对 Zend_Service_Amazon_Sqs->receive() 的每次调用均前往单一一个音讯。这个单个音讯是以数组的方式前往的,不过,必需运用 $message[0][...] 来访问音讯的这些局部。
留意:某些音讯系统准许无需接纳音讯即可检查它,这种操作常被称为窥视(peeking)。Amazon SQS 却不再准许对音讯举行窥视。检查音讯的唯一办法是先接纳它。
单击 “Receive Next Message” 按钮后,后果应如图 9 所示。
图 9. 一个接纳到的音讯
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片9](/Files/BeyondPic/2010-6/22/1062223450014470.jpeg)
可见性超时用来生成这样的一个句子 “It will go back into the queue in 30 seconds.”,稍后就会细致引见队列属性。
图 10. 音讯句柄和可见性超时
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片10](/Files/BeyondPic/2010-6/22/1062223450090243.jpeg)
正如之前提到的,$message[0]['handle'] 前往音讯的句柄。运用 getAttribute() 办法能够前往可见性超时。
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
清单 9. 找到队列的可见性超时
$visibilityTimeout =
$sqs->getAttribute($_POST['queueToUse'], 'VisibilityTimeout'); 可见性超时用来生成句子 “It will go back into the queue in 30 seconds.”。getAttribute() 让您能够找到队列的各种细致信息;稍后会细致引见队列属性。
显示所接纳的音讯的这个表单是由如下代码生成的。
清单 10. 为所接纳的音讯生成表单
echo "<form action='".$_SERVER['PHP_SELF']."' method='post'>";
// Display the message itself in a <textarea>
echo "The message from the queue is: <br/><br/>";
echo "<textarea cols='80' rows='8'>";
echo $message[0]['body'];
echo "</textarea><br/><br/>";
// The message handle and queue name are hidden fields
echo "<input type='hidden' name='deleteMessage' value='1'/>";
echo "<input type='hidden' name='messageHandle' ";
echo "value='".$message[0]['handle']."'>";
echo "<input type='hidden' name='queueToUse' ";
echo "value='".$_POST['queueToUse']."'>";
// The submit button deletes the message
echo "To delete this message, click here: ";
echo "<input type='submit' value='Delete Message'><br/><br/>";
// Display the message handle if the user wants to delete it later
echo "If you want to delete this message ";
echo "later, use this message handle: <br/><br/>";
echo "<textarea cols='80' rows='3'>";
echo $message[0]['handle']."</textarea><br/><br/>";
// For information, display the visibility timeout of the queue
echo "If you do not delete this message, it will ";
echo "go back into the queue in ".$visibilityTimeout." seconds.";
echo "</form>"; 延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
删除一个音讯
正如在之前的一节中所提到的,显示所接纳音讯的表单还包含了一个用来删除音讯的按钮。若要调用 Zend_Service_Amazon_Sqs->deleteMessage() 办法,须要队列名和音讯句柄。
清单 11. 从一个队列删除音讯
try {
$response = $sqs->deleteMessage($_POST['queueToUse'],
$_POST['messageHandle']);
echo "The message was deleted successfully.";
}
catch (Zend_Service_Amazon_SQS_Exception $sqse) {
echo "The message could not be deleted. The error message from Amazon is:";
echo "<br/><br/><i>".$sqse->getMessage()."</i>";
} 假设音讯被成功删除,页面就会显示一条音讯。
图 11. 音讯成功删除
![运用 PHP 完成云计算,第 3 部分: 议决 Zend Framework 运用 Amazon SQS[多图]图片11](/Files/BeyondPic/2010-6/22/1062223450039626.jpeg)
假设发作任何疑问,此代码就会显示一个异常。(创立一个表单来让用户议决传递音讯句柄和队列名删除音讯的操作留给读者自己练习。)
获得队列的属性
正如之前提到的,在接纳音讯时,PHP 页面会显示可见性超时。这是议决调用 getAttribute() 完成的。getAttribute() 的第一个属性是队列名。关于第二个参数,Amazon 当前支持如下的属性名,并且大小写敏感:
VisibilityTimeout — 接纳自此队列的音讯的可见性超时。
ApproximateNumberOfMessages — 当前队列内音讯的大致数目。这不包含已接纳到的任何音讯。
延伸阅读
- 运用 PHP 完成云计算,第 2 局部: 议决 Zend Framework 运用 Amazon EC2
- 运用 PHP 完成云计算,第 1 局部: 结合运用 Amazon S3 和 Zend Framework
读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!
如果你喜欢这页,可以按Ctrl+D收藏起来。







