1、首先需要安装stomp的php扩展,stomp5.6,将该文件放入php的扩展库ext文件夹中。
2、在php.ini中加入扩展配置:extension=php_stomp.dll,然后重启服务。
3、activeMQ主要有两个操作,即生产端与消费端
生产端代码如下:
<?php
use Yii;
use app\components\Curl;
class ProductClass{
private $user = "admin";
private $password = "admin";
private $host = "10.100.200.20";
private $port = "8161";
private $destination = "queue://smssykjyzmqueue"; // 目的地址
private $apipubaddr = "/api/message?"; // api发布地址
private $codeMsg = array(
'20000'=>'发布成功',
'20001'=>'发布内容不能为空',
'20002'=>'发布内容格式不对',
'20003'=>'stomp 未连接成功',
'20004'=>'发布内容失败',
'20005'=>'其它错误',
);
/**
* @param $body json 发送的数组内容
* @param null $destination
* @return string
* @throws \app\components\InvalidParamException
*/
public function sendQueue($body,$destination=null){
try {
if(empty($body)){
return $this->beJson('20001');
}
// 传输过来的不是json
if(!Curl::is_json($body)){
return $this->beJson('20002');
}
$to = ($destination && is_string($destination)) ? $destination : $this->destination;
$url = 'http://' . $this->user . ':' . $this->password . '@' . $this->host . ":" . $this->port .$this->apipubaddr.'destination='. $to;
$res = Curl::http($url, ['body'=>$body], 'post');
if($res != 'Message sent'){
return $this->beJson('20005');
}
} catch(StompException $e) {
return $this->beJson('20003');
}
return $this->beJson('20000');
}
/**
* 返回值
* @param $code
* @return string
*/
public function beJson($code){
return json_encode(
array(
'errcode'=>$code,
'errmsg'=>$this->codeMsg[$code]
),JSON_UNESCAPED_UNICODE
);
exit;
}
}
$body = '
{
"platform":"6",
"sign":"测试",
"mobile":"15820786542",
"content":"您好!您的验证码为122223",
"type":"1",
"callback":"http://lib.sms.com/v1/sms-api-send/sms-send",
"taskid":"20161031111134170349"
}';
$obj = new ProductClass();
$obj->sendQueue($body);
消费端代码如下:
<?php
define('QUEUE', 'smssykjyzmqueue');
$user = getenv("ACTIVEMQ_USER");
if (!$user) $user = "admin";
$password = getenv("ACTIVEMQ_PASSWORD");
if (!$password) $password = "admin";
$host = getenv("ACTIVEMQ_HOST");
if (!$host) $host = "10.100.200.20";
$port = getenv("ACTIVEMQ_PORT");
if (!$port) $port = 61613;
$destination = '/queue/' . QUEUE;
try {
$url = 'tcp://' . $host . ":" . $port;
$stomp = new Stomp($url, $user, $password);
$stomp->subscribe($destination);
while (true) {
if ($stomp->hasFrame()) {
$frame = $stomp->readFrame();
if ($frame != NULL) {
// 收到的数据为 $frame->body
$res = json_decode($frame->body, true);
$url = $res['callback'];
unset($res['callback']);
$res = json_encode($res,JSON_UNESCAPED_UNICODE);
$data = http($url, $res, "raw"); // 根据回调地址执行短信发送
$dataArr = json_decode($data, true);
if($dataArr['errcode'] == 20000) {
file_put_contents('./'.date('Y-m-d').'sykjyzmsmsSend.txt',date('Y-m-d H:i:s')."发送成功------ 参数".$res."--返回值--".$data."\r\n",FILE_APPEND);
}else{
file_put_contents('./'.date('Y-m-d').'sykjyzmsmsSend.txt',date('Y-m-d H:i:s')."发送失败------ 参数".$res."--返回值--".$data."\r\n",FILE_APPEND);
}
$stomp->ack($frame);
}
}
}
} catch(StompException $e) {
echo $e->getMessage();
}
function http($url, $params = null, $type = 'get')
{
$curl = curl_init();
switch ($type) {
case 'get':
is_array($params) && $params = http_build_query($params);
!empty($params) && $url .= (stripos($url, '?') === false ? '?' : '&') . $params;
break;
case 'post':
curl_setopt($curl, CURLOPT_POST, true);
if (!is_array($params)) {
throw new InvalidParamException("Post data must be an array.");
}
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
break;
case 'raw':
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_POST, true);
if (is_array($params)) {
is_array($params) && $params = json_encode($params, JSON_UNESCAPED_UNICODE);
}
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
break;
default:
throw new InvalidParamException("Invalid http type '{$type}.' called.");
}
if (stripos($url, "https://") !== false) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); // 微信官方屏蔽了ssl2和ssl3, 启用更高级的ssl
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($curl);
$status = curl_getinfo($curl);
$errno = curl_errno($curl);
curl_close($curl);
if (isset($status['http_code']) && intval($status['http_code']) == 200) {
return $content;
}
return false;
}
3613



被折叠的 条评论
为什么被折叠?



