阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 9082阅读
  • 2回复

[解决方案]PHP重写的消息队列MQ类

级别: 新人
发帖
2
云币
11
阿里的大神们好像是JAVA出身,很多文档都是根据JAVA习惯或规范写的,对我们这种非JAVA的来说,非常不方便。 E]Dcb*t  
接合文档和[售后工程师帮助重写了AliONS类,希望对后来者有帮助,少走弯路。也希望大神们看看HTTP协议文档。 rWsUWA T*  
}22h)){n#Y  
  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. // ====== 测试DEMO =========================
  4. $config = array();
  5. $config['AK'] = ''; // Access Key ID
  6. $config['SK'] = ''; // Access Key Secret
  7. $config['Topic'] = 'phpbin_2016';
  8. $config['PID'] = 'PID_phpbin';
  9. $config['CID'] = 'CID_phpbin';
  10. $AM = new AliONS($config);
  11. //$data = $AM->send('aaa');
  12. //$data = $AM->revice();
  13. $data = $AM->delete('X1BFTkRJTkdNU0dfI3BocGJpbl8yMDE2I3FkaW50ZXJuZXQtMDMjMiM0I0NJRF9waHBiaW4=');
  14. echo '<pre>';
  15. var_dump($data);
  16. exit();
  17. // ==========================================
  18. /**
  19. * 阿里云消息服务(ONS)
  20. * 文档:
  21. * https://help.aliyun.com/document_detail/ons/sdk/java-sdk/ons-http-rule.html?spm=5176.docons/sdk/java-sdk/set-env.6.101.hwHPLu
  22. *
  23. * @author phpbin
  24. *
  25. */
  26. class AliONS
  27. {
  28.     /**
  29.      * 服务地址(公测)
  30.      *
  31.      * @var string
  32.      */
  33.     private $_URL = 'http://publictest-rest.ons.aliyun.com';
  34.     
  35.     /**
  36.      * Access Key
  37.      *
  38.      * @var string
  39.      */
  40.     private $_AK;
  41.     
  42.     /**
  43.      * SecretAccessKey
  44.      *
  45.      * @var string
  46.      */
  47.     private $_SK;
  48.     
  49.     /**
  50.      * TopIC
  51.      *
  52.      * @var string
  53.      */
  54.     private $_Topic;
  55.     
  56.     /**
  57.      * 生产者ID
  58.      *
  59.      * @var string
  60.      */
  61.     private $_PID;
  62.     
  63.     /**
  64.      * 订阅者ID
  65.      *
  66.      * @var string
  67.      */
  68.     private $_CID;
  69.     
  70.     /**
  71.      * 时间(毫秒数)
  72.      *
  73.      * @var string
  74.      */
  75.     private $_Time;
  76.     
  77.     /**
  78.      * 签名
  79.      *
  80.      * @var string
  81.      */
  82.     private $_Sign;
  83.     
  84.     /**
  85.      * 初始
  86.      *
  87.      */
  88.     public function __construct($config = array())
  89.     {
  90.         foreach ( $config as $key=>$val)
  91.         {
  92.           $this->{"_".$key} = $val;
  93.         }
  94.         $this->_Time = $this->_microtime();
  95.     }
  96.     
  97.     
  98.     /**
  99.      * 发送消息
  100.      *
  101.      * @param string $body 消息内容
  102.      * @return array
  103.      */
  104.     public function send($body)
  105.     {
  106.         $url = $this->_URL."/message/?topic=".$this->_Topic."&time=".$this->_Time."&tag=http&key=http";
  107.         $signStr = $this->_Topic."\n".$this->_PID."\n".md5($body)."\n".$this->_Time;
  108.         $this->_signature($signStr);
  109.         $stream = $this->_html($url, $body, 'POST');
  110.         return json_decode($stream, true);
  111.     }
  112.     
  113.     /**
  114.      * 接收消息
  115.      * 说明:没有消息返回空数组
  116.      *
  117.      * @return array
  118.      */
  119.     public function revice()
  120.     {
  121.         $url = $this->_URL."/message/?topic=".$this->_Topic."&time=".$this->_Time."&num=32";
  122.         $signStr = $this->_Topic."\n".$this->_CID."\n".$this->_Time;
  123.         $this->_signature($signStr);
  124.         $stream = $this->_html($url, '', 'GET');
  125.         return json_decode($stream, true);
  126.     }
  127.     
  128.     /**
  129.      * 删除消息
  130.      * 说明:删除成功返回空消息
  131.      *
  132.      * @param string $msgHandle 消息标识
  133.      */
  134.     public function delete($msgHandle)
  135.     {
  136.         $url = $this->_URL."/message/?msgHandle=".$msgHandle."&topic=".$this->_Topic."&time=".$this->_Time;
  137.         $signStr = $this->_Topic."\n".$this->_CID."\n".$msgHandle."\n".$this->_Time;
  138.         $this->_signature($signStr);
  139.         $stream = $this->_html($url, '', 'DELETE');
  140.         return json_decode($stream, true);
  141.     }
  142.     
  143.     
  144.     /**
  145.      * 生成签名
  146.      *
  147.      * @param string $signStr
  148.      * @return string
  149.      */
  150.     private function _signature($signStr)
  151.     {
  152.       $this->_Sign = base64_encode(hash_hmac('sha1', $signStr, $this->_SK, true));
  153.     }
  154.     
  155.     /**
  156.      * 生成毫秒时间
  157.      *
  158.      * @return integer
  159.      */
  160.     private function _microtime(){
  161.     $time = explode(" ", microtime () );
  162.     $time = $time[1].($time [0] * 1000);
  163.     $time2 = explode(".", $time );
  164.     $time = $time2[0];
  165.     return $time;
  166.     }
  167.     
  168.     /**
  169.      * 提交请求数据
  170.      *
  171.      * @param string $url 地址
  172.      * @param string $post 请求体
  173.      * @param string $method 请求类型 POST|PULL|GET|DELETE
  174.      * @return mixed
  175.      */
  176.     private function _html($url, $post='', $method='POST')
  177.     {
  178.         $header = array();
  179.         $header[] = 'User-Agent: Jetty/9.3.4.RC';
  180.         $header[] = 'Host:publictest-rest.ons.aliyun.com';
  181.         $header[] = 'AccessKey:'.$this->_AK;
  182.         $header[] = 'Signature:'.$this->_Sign;
  183.         $header[] = 'ProducerId:'.$this->_PID;
  184.         $header[] = 'ConsumerId:'.$this->_CID;
  185.         $header[] = 'Content-Type: text/plain;charset=UTF-8';
  186.         
  187.         $ch = curl_init($url);
  188.         curl_setopt($ch, CURLOPT_TIMEOUT, 100);
  189.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  190.         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  191.         if ( $method)  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
  192.         if ( $post) curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  193.         $html = curl_exec($ch);
  194.         curl_close($ch);
  195.         return $html;
  196.     }
  197. }
  198. /** End of Class AliONS **/
  199. /** End of file AliONS.php **/
'b1k0 9'  
[ 此帖被gia114在2016-04-01 17:47重新编辑 ]
级别: 论坛版主
发帖
4292
云币
2524

只看该作者 沙发  发表于: 2016-04-02
感谢分享!!!!!!!!!!!
级别: 新人
发帖
1
云币
2
只看该作者 板凳  发表于: 2017-01-15
RePHP重写的消息队列MQ类
你好,我遇到一个问题,就是可以发送,但是在调用接收消息$data = $AM->revice();时候,总是返回 空
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)