<?php
namespace
think;
date_default_timezone_set('Asia/Shanghai');
require_once
__DIR__ . '/thinkphp/base.php';
use
think\cache\driver\Redis;
use
think\Db;
class
Swoole
{
const
errcode =
array
(
43004 =>
'需要接收者关注'
,
40037 =>
'无效模板'
,
40003 =>
'需要接收者关注'
,
43005 =>
'需要好友关系'
,
43019 =>
'需要将接收者从黑名单中移除'
,
44001 =>
'多媒体文件为空'
,
44002 =>
'POST 的数据包为空'
,
44003 =>
'图文消息内容为空'
,
44004 =>
'文本消息内容为空'
,
45001 =>
'多媒体文件大小超过限制'
,
45002 =>
'消息内容超过限制'
,
45003 =>
'标题字段超过限制'
,
45004 =>
'描述字段超过限制'
,
45005 =>
'链接字段超过限制'
,
45006 =>
'图片链接字段超过限制'
,
45007 =>
'语音播放时间超过限制'
,
45008 =>
'图文消息超过限制'
,
45009 =>
'接口调用超过限制'
,
45010 =>
'创建菜单个数超过限制'
,
45011 =>
'API 调用太频繁,请稍候再试'
,
);
private
$serv
;
private
$redis
;
private
$conn
= [
'type'
=>
'mysql'
,
'hostname'
=>
''
,
'database'
=>
''
,
'username'
=>
''
,
'password'
=>
''
,
'hostport'
=>
'3306'
,
'dsn'
=>
''
,
'params'
=> [],
'charset'
=>
'utf8'
,
'prefix'
=>
'shd_'
,
'debug'
=> true,
'resultset_type'
=>
'array'
,
'auto_timestamp'
=> false,
'datetime_format'
=>
'Y-m-d H:i:s'
,
'sql_explain'
=> false,
'builder'
=>
''
,
'query'
=>
'\\think\\db\\Query'
,
'break_reconnect'
=> false,
'break_match_str'
=> [],
];
public
function
__construct()
{
$this
->redis =
new
Redis();
$this
->serv =
new
\swoole_server(
"0.0.0.0"
, 9501);
$this
->serv->set(
array
(
'worker_num'
=> 2,
'daemonize'
=> 1,
'max_request'
=> 10000,
'dispatch_mode'
=> 2,
'task_worker_num'
=> 8,
"task_ipc_mode "
=> 3,
"log_file"
=>
"taskqueueu.log"
,
));
$this
->serv->on(
'Receive'
,
array
(
$this
,
'onReceive'
));
$this
->serv->on(
'Task'
,
array
(
$this
,
'onTask'
));
$this
->serv->on(
'Finish'
,
array
(
$this
,
'onFinish'
));
$this
->serv->start();
}
public
function
onReceive(\swoole_server
$serv
,
$fd
,
$from_id
,
$data
)
{
echo
"Get Message From Client {$fd}:{$data}\n"
;
$serv
->send(
$fd
,
'发送任务已建立,正在发送,请稍后查看发送记录'
);
$serv
->task(
$data
);
}
public
function
onTask(
$serv
,
$task_id
,
$from_id
,
$data
)
{
echo
"Task {$task_id} task\n"
;
$array
= json_decode(
$data
, true);
$success
= 0;
$fail
= 0;
$log
=
''
;
$access_token
=
$array
[
'access_token'
];
$openid_list
=
$this
->redis->sMembers(
$array
[
'appid'
].
'users'
);
$fields
= json_decode(
$array
[
'data'
],true);
$send_data
=
array
();
$start
= time();
foreach
(
$openid_list
as
$openid
) {
$template
=
array
(
'touser'
=>
$openid
,
'template_id'
=>
$array
[
'tem_id'
],
'url'
=>
$array
[
'url'
],
'topcolor'
=>
"#000000"
,
'data'
=>
$send_data
,
);
$url
=
"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
.
$access_token
;
$res
=
$this
->send_post(
$url
,
$template
);
$res_arr
= json_decode(
$res
, true);
if
(
$res_arr
[
'errcode'
] == 0){
++
$success
;
}
else
{
++
$fail
;
$log
= self::errcode[
$res_arr
[
'errcode'
]];
}
}
$result
=
array
(
'success'
=>
$success
,
'fail'
=>
$fail
,
'tem_id'
=>
$array
[
'tem_id'
],
'uid'
=>
$array
[
'uid'
],
'data'
=>
$array
[
'data'
],
'url'
=>
$array
[
'url'
],
'log'
=>
$log
,
'start'
=>
$start
);
return
json_encode(
$result
);
}
public
function
onFinish(
$serv
,
$task_id
,
$data
)
{
$array
= json_decode(
$data
,true);
$fields
= json_decode(
$array
[
'data'
],true);
$list
= Db::connect(
$this
->conn)->name(
'wechat_template'
)->where(
'template_id'
,
$array
[
'tem_id'
])->where(
'uid'
,
$array
[
'uid'
])->find();
$new_field
=
$list
[
'field'
];
$insert
[
'template_id'
] =
$array
[
'tem_id'
];
$insert
[
'success'
] =
$array
[
'success'
];
$insert
[
'fail'
] =
$array
[
'fail'
];
$insert
[
'url'
] =
$array
[
'url'
];
$insert
[
'log'
] =
$array
[
'log'
];
$insert
[
'create_time'
] =
date
(
'Y-m-d H:i:s'
,
$array
[
'start'
]);
$insert
[
'finish_time'
] =
date
(
'Y-m-d H:i:s'
);
Db::connect(
$this
->conn)->name(
'wechat_template_log'
)->insert(
$insert
);
echo
"Task{$data} {$task_id} finish\n"
;
}
function
send_post(
$url
,
$post_data
) {
$postdata
=json_encode(
$post_data
,JSON_UNESCAPED_UNICODE);
$options
=
array
(
'http'
=>
array
(
'method'
=>
'POST'
,
'header'
=>
'Content-type:application/x-www-form-urlencoded'
,
'content'
=>
$postdata
,
'timeout'
=> 2
)
);
$context
= stream_context_create(
$options
);
$result
=
file_get_contents
(
$url
, false,
$context
);
return
$result
;
}
}
$server
=
new
Swoole();