PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/1.0RC4/src/LibWebta/library/NET/API/AWS/class.AmazonSQS.php

http://scalr.googlecode.com/
PHP | 165 lines | 105 code | 30 blank | 30 comment | 5 complexity | 513d876e13cc63d390a7b3d75b360870 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, GPL-3.0
  1. <?php
  2. class AmazonSQS
  3. {
  4. const API_VERSION = "2008-01-01";
  5. const HASH_ALGO = 'SHA1';
  6. const USER_AGENT = 'Libwebta AWS Client (http://webta.net)';
  7. private $AWSAccessKeyId = NULL;
  8. private $AWSAccessKey = NULL;
  9. private $LastResponseHeaders = array();
  10. private static $Instance;
  11. public static function GetInstance($AWSAccessKeyId, $AWSAccessKey)
  12. {
  13. self::$Instance = new AmazonSQS($AWSAccessKeyId, $AWSAccessKey);
  14. return self::$Instance;
  15. }
  16. public function __construct($AWSAccessKeyId, $AWSAccessKey)
  17. {
  18. $this->AWSAccessKeyId = $AWSAccessKeyId;
  19. $this->AWSAccessKey = $AWSAccessKey;
  20. if (!function_exists("hash_hmac"))
  21. throw new Exception("hash_hmac() function not found. Please install HASH Pecl extension.", E_ERROR);
  22. }
  23. private function GetRESTSignature($params)
  24. {
  25. return base64_encode(@hash_hmac(AmazonCloudFront::HASH_ALGO, implode("\n", $params), $this->AWSAccessKey, 1));
  26. }
  27. /**
  28. * Return GMT timestamp for Amazon AWS S3 Requests
  29. *
  30. * @return unknown
  31. */
  32. private function GetTimestamp()
  33. {
  34. date_default_timezone_set("GMT");
  35. return date("c", time()+3600);
  36. }
  37. private function Request($method, $uri, $args)
  38. {
  39. $HttpRequest = new HttpRequest();
  40. $HttpRequest->setOptions(array( "redirect" => 10,
  41. "useragent" => "LibWebta AWS Client (http://webta.net)"
  42. )
  43. );
  44. $timestamp = $this->GetTimestamp();
  45. $URL = "queue.amazonaws.com";
  46. $args['Version'] = self::API_VERSION;
  47. $args['SignatureVersion'] = 2;
  48. $args['SignatureMethod'] = "HmacSHA1";
  49. $args['Expires'] = $timestamp;
  50. $args['AWSAccessKeyId'] = $this->AWSAccessKeyId;
  51. ksort($args);
  52. foreach ($args as $k=>$v)
  53. $CanonicalizedQueryString .= "&{$k}=".urlencode($v);
  54. $CanonicalizedQueryString = trim($CanonicalizedQueryString, "&");
  55. $args['Signature'] = $this->GetRESTSignature(array($method, $URL, $uri, $CanonicalizedQueryString));
  56. $HttpRequest->setUrl("https://{$URL}{$uri}");
  57. $HttpRequest->setMethod(constant("HTTP_METH_{$method}"));
  58. if ($args)
  59. $HttpRequest->addQueryData($args);
  60. try
  61. {
  62. $HttpRequest->send();
  63. //$info = $HttpRequest->getResponseInfo();
  64. $data = $HttpRequest->getResponseData();
  65. $this->LastResponseHeaders = $data['headers'];
  66. $response = simplexml_load_string($data['body']);
  67. if ($response->Error)
  68. throw new Exception($response->Error->Message);
  69. else
  70. return $response;
  71. }
  72. catch (Exception $e)
  73. {
  74. if ($e->innerException)
  75. $message = $e->innerException->getMessage();
  76. else
  77. $message = $e->getMessage();
  78. throw new Exception($message);
  79. }
  80. }
  81. /**
  82. * The SendMessage action delivers a message to the specified queue. The maximum allowed message size is 8 KB.
  83. * @param $queue_name
  84. * @param $message
  85. * @return string $messageID
  86. */
  87. public function SendMessage($queue_name, $message)
  88. {
  89. $response = $this->Request("GET", "/{$queue_name}", array("Action" => "SendMessage", "MessageBody" => base64_encode($message)));
  90. return $response->SendMessageResult->MessageId;
  91. }
  92. /**
  93. * The DeleteMessage action deletes the specified message from the specified queue.
  94. * @param $receipt_handle
  95. * @return bool
  96. */
  97. public function DeleteMessage($receipt_handle)
  98. {
  99. $response = $this->Request("GET", "/{$queue_name}", array("Action" => "DeleteMessage", "ReceiptHandle" => $receipt_handle));
  100. return true;
  101. }
  102. /**
  103. * The CreateQueue action creates a new queue.
  104. * @param $queue_name
  105. * @param $visibility_timeout
  106. * @return string $QueueUrl
  107. */
  108. public function CreateQueue($queue_name, $visibility_timeout = 30)
  109. {
  110. $response = $this->Request("GET", "", array("Action" => "CreateQueue", "QueueName" => $queue_name, "DefaultVisibilityTimeout" => $visibility_timeout));
  111. return $response->CreateQueueResult->QueueUrl;
  112. }
  113. /**
  114. * The ReceiveMessage action retrieves one or more messages from the specified queue.
  115. * @param $queue_name
  116. * @param $max_number_of_messages
  117. * @param $visibility_timeout
  118. * @return array
  119. */
  120. public function ReceiveMessage($queue_name, $max_number_of_messages = 1, $visibility_timeout = 30)
  121. {
  122. $response = $this->Request("GET", "/$queue_name", array("Action" => "ReceiveMessage", "MaxNumberOfMessages" => $max_number_of_messages, "DefaultVisibilityTimeout" => $visibility_timeout));
  123. if (!is_array($response->ReceiveMessageResult->Message))
  124. $retval = array($response->ReceiveMessageResult->Message);
  125. else
  126. $retval = $response->ReceiveMessageResult->Message;
  127. foreach ($retval as &$r)
  128. {
  129. $r = (array)$r;
  130. $r['Body'] = base64_decode($r['Body']);
  131. }
  132. return $retval;
  133. }
  134. }
  135. ?>