PageRenderTime 39ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/demo/scalr_newui/app/src/LibWebta/library/NET/API/AWS/class.AmazonSQS.php

https://github.com/kennethjiang/Wolke
PHP | 223 lines | 141 code | 40 blank | 42 comment | 10 complexity | e24fda6699df715f8d3a7a61f03a554e MD5 | raw file
  1. <?php
  2. class AmazonSQS
  3. {
  4. const API_VERSION = "2009-02-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 $Region = 'us-east-1';
  11. private static $Instance;
  12. public static function GetInstance($AWSAccessKeyId, $AWSAccessKey)
  13. {
  14. self::$Instance = new AmazonSQS($AWSAccessKeyId, $AWSAccessKey);
  15. return self::$Instance;
  16. }
  17. public function __construct($AWSAccessKeyId, $AWSAccessKey)
  18. {
  19. $this->AWSAccessKeyId = $AWSAccessKeyId;
  20. $this->AWSAccessKey = $AWSAccessKey;
  21. if (!function_exists("hash_hmac"))
  22. throw new Exception("hash_hmac() function not found. Please install HASH Pecl extension.", E_ERROR);
  23. }
  24. private function GetRESTSignature($params)
  25. {
  26. return base64_encode(@hash_hmac(AmazonCloudFront::HASH_ALGO, implode("\n", $params), $this->AWSAccessKey, 1));
  27. }
  28. /**
  29. * Return GMT timestamp for Amazon AWS S3 Requests
  30. *
  31. * @return unknown
  32. */
  33. private function GetTimestamp()
  34. {
  35. $tz = @date_default_timezone_get();
  36. date_default_timezone_set("GMT");
  37. $dt = date("c", time()+3600);
  38. date_default_timezone_set($tz);
  39. return $dt;
  40. }
  41. public function SetRegion($region)
  42. { // only US region is available now
  43. if (in_array($region, array('us-east-1', 'eu-west-1', 'us-west-1', 'ap-southeast-1', 'ap-northeast-1')))
  44. $this->Region = $region;
  45. }
  46. private function Request($method, $uri, $args)
  47. {
  48. $HttpRequest = new HttpRequest();
  49. $HttpRequest->setOptions(array( "redirect" => 10,
  50. "useragent" => "LibWebta AWS Client (http://webta.net)"
  51. )
  52. );
  53. $timestamp = $this->GetTimestamp();
  54. $URL = "queue.amazonaws.com";
  55. if ($this->Region != 'us-east-1')
  56. $URL = "{$this->Region}.queue.amazonaws.com";
  57. //EU URL: eu-west-1.queue.amazonaws.com
  58. $args['Version'] = self::API_VERSION;
  59. $args['SignatureVersion'] = 2;
  60. $args['SignatureMethod'] = "HmacSHA1";
  61. $args['Expires'] = $timestamp;
  62. $args['AWSAccessKeyId'] = $this->AWSAccessKeyId;
  63. ksort($args);
  64. foreach ($args as $k=>$v)
  65. $CanonicalizedQueryString .= "&{$k}=".urlencode($v);
  66. $CanonicalizedQueryString = trim($CanonicalizedQueryString, "&");
  67. $args['Signature'] = $this->GetRESTSignature(array($method, $URL, $uri, $CanonicalizedQueryString));
  68. $HttpRequest->setUrl("https://{$URL}{$uri}");
  69. $HttpRequest->setMethod(constant("HTTP_METH_{$method}"));
  70. if ($args)
  71. $HttpRequest->addQueryData($args);
  72. try
  73. {
  74. $HttpRequest->send();
  75. //$info = $HttpRequest->getResponseInfo();
  76. $data = $HttpRequest->getResponseData();
  77. $this->LastResponseHeaders = $data['headers'];
  78. $response = simplexml_load_string($data['body']);
  79. if ($response->Error)
  80. throw new Exception($response->Error->Message);
  81. else
  82. return $response;
  83. }
  84. catch (Exception $e)
  85. {
  86. if ($e->innerException)
  87. $message = $e->innerException->getMessage();
  88. else
  89. $message = $e->getMessage();
  90. throw new Exception($message);
  91. }
  92. }
  93. /**
  94. * The ListQueues action returns a list of your queues.
  95. * @param string $queue_name_prefix
  96. * @return array
  97. */
  98. public function ListQueues($queue_name_prefix = '')
  99. {
  100. $response = $this->Request("GET", "/", array("Action" => "ListQueues", "QueueNamePrefix" => $queue_name_prefix));
  101. $retval = (array)$response->ListQueuesResult;
  102. if (!is_array($retval['QueueUrl']))
  103. $list = array($retval['QueueUrl']);
  104. else
  105. $list = $retval['QueueUrl'];
  106. foreach ($list as &$r)
  107. $r = basename($r);
  108. return $list;
  109. }
  110. /**
  111. * The GetQueueAttributes action gets one or all attributes of a queue.
  112. * @param string $queue_name
  113. * @param string $attribute
  114. * @return array
  115. */
  116. public function GetQueueAttributes($queue_name, $attribute='All')
  117. {
  118. $response = $this->Request("GET", "/{$queue_name}", array("Action" => "GetQueueAttributes", "AttributeName" => $attribute));
  119. $list = (array)$response->GetQueueAttributesResult;
  120. if (!is_array($list['Attribute']))
  121. $list = array($list['Attribute']);
  122. else
  123. $list = $list['Attribute'];
  124. $retval = array();
  125. foreach ($list as $l)
  126. $retval[(string)$l->Name] = (string)$l->Value;
  127. return $retval;
  128. }
  129. /**
  130. * The SendMessage action delivers a message to the specified queue. The maximum allowed message size is 8 KB.
  131. * @param $queue_name
  132. * @param $message
  133. * @return string $messageID
  134. */
  135. public function SendMessage($queue_name, $message)
  136. {
  137. $response = $this->Request("GET", "/{$queue_name}", array("Action" => "SendMessage", "MessageBody" => base64_encode($message)));
  138. return $response->SendMessageResult->MessageId;
  139. }
  140. /**
  141. * The DeleteMessage action deletes the specified message from the specified queue.
  142. * @param $receipt_handle
  143. * @return bool
  144. */
  145. public function DeleteMessage($receipt_handle)
  146. {
  147. $response = $this->Request("GET", "/{$queue_name}", array("Action" => "DeleteMessage", "ReceiptHandle" => $receipt_handle));
  148. return true;
  149. }
  150. /**
  151. * The CreateQueue action creates a new queue.
  152. * @param $queue_name
  153. * @param $visibility_timeout
  154. * @return string $QueueUrl
  155. */
  156. public function CreateQueue($queue_name, $visibility_timeout = 30)
  157. {
  158. $response = $this->Request("GET", "", array("Action" => "CreateQueue", "QueueName" => $queue_name, "DefaultVisibilityTimeout" => $visibility_timeout));
  159. return $response->CreateQueueResult->QueueUrl;
  160. }
  161. /**
  162. * The ReceiveMessage action retrieves one or more messages from the specified queue.
  163. * @param $queue_name
  164. * @param $max_number_of_messages
  165. * @param $visibility_timeout
  166. * @return array
  167. */
  168. public function ReceiveMessage($queue_name, $max_number_of_messages = 1, $visibility_timeout = 30)
  169. {
  170. $response = $this->Request("GET", "/$queue_name", array("Action" => "ReceiveMessage", "MaxNumberOfMessages" => $max_number_of_messages, "DefaultVisibilityTimeout" => $visibility_timeout));
  171. if (!is_array($response->ReceiveMessageResult->Message))
  172. $retval = array($response->ReceiveMessageResult->Message);
  173. else
  174. $retval = $response->ReceiveMessageResult->Message;
  175. foreach ($retval as &$r)
  176. {
  177. $r = (array)$r;
  178. $r['Body'] = base64_decode($r['Body']);
  179. }
  180. return $retval;
  181. }
  182. }
  183. ?>