Mega-Wechat เป็นบริการสำหรับการส่งข้อความเทมเพลต WeChat ซึ่งใช้งานตามกรอบงานเครือข่าย Swoole รองรับการส่งข้อความจำนวนมากและดำเนินการอินเทอร์เฟซข้อความเทมเพลตการส่งไปพร้อมกัน กระบวนการส่งทั้งหมดจะดำเนินการตามคิวตามลำดับก่อนหลัง รองรับข้อความเทมเพลตที่ปรับแต่งเอง ซึ่งสามารถเปลี่ยนแปลงและใช้งานได้ตลอดเวลา
เมื่อดำเนินธุรกิจในบริษัท จำเป็นต้องส่งข้อความเทมเพลต WeChat ไปยังผู้ใช้ที่กำหนดบ่อยครั้ง ในขณะนั้น การดำเนินธุรกิจอื่น ๆ เป็นเรื่องเร่งด่วนมากขึ้น ดังนั้นจึงเป็นเพียงเรื่องของการเข้ารหัสข้อความเทมเพลตบางส่วนลงในตัวควบคุมแล้วดำเนินการ คำสั่งเพื่อดำเนินการตามข้อกำหนดในการใช้งาน ดังนั้น เมื่อเปลี่ยนเนื้อหาเทมเพลต คุณจะต้องเปลี่ยนโค้ดและอัปเดตด้วย git นอกจากนี้ เนื่องจากปัญหาของกระบวนการเดียว การส่งข้อความเทมเพลตจำนวนมากจึงใช้เวลานานมาก (สาเหตุหลักมาจากเวลา- เสียเวลาในการเรียกอินเทอร์เฟซ WeChat)
มีวิธีแก้ไขปัญหาหลายประการสำหรับสิ่งนี้:
วิธีแรกใช้ไคลเอ็นต์แบบหลายกระบวนการโดยตรงเพื่อเรียก WeChat เพื่อส่งข้อความเทมเพลต API ผ่าน Curl วิธีนี้ง่ายและรวดเร็วในการนำไปใช้ แต่ไม่สามารถรองรับความต้องการของธุรกิจอื่น ๆ ในการเรียกข้อความเทมเพลตได้
วิธีที่สองคือให้กระบวนการเดียวกระจายงานและแยกกระบวนการย่อยหลายรายการ และสำรวจคิว Redis อย่างต่อเนื่องผ่านกระบวนการย่อย นอกจากนี้ โซลูชันนี้ยังค่อนข้างใช้งานง่าย แต่ความสามารถในการควบคุมต่ำมากจนควบคุมได้ยาก
โซลูชันที่สามที่ใช้อยู่ในปัจจุบันคือการใช้บริการที่คล้ายกับคิวข้อความผ่าน swoole งานหลายอย่างดำเนินการขดช้าเพื่อปรับ WeChat API และสามารถส่งคืนผลลัพธ์การดำเนินการไปยังไคลเอนต์ได้ เนื่องจาก swoole เป็นเฟรมเวิร์กเครือข่ายที่ทรงพลังมากและสามารถรับการทำงานพร้อมกันได้จำนวนมาก ตามทฤษฎีแล้ว swoole สามารถรองรับคำขอส่งข้อความเทมเพลตจำนวนมากได้ อย่างไรก็ตาม เนื่องจาก API การส่งเทมเพลตข้อความของ WeChat นั้นค่อนข้างใช้เวลานาน จึงมีจำนวนมาก ร้องขอการส่งมอบ ดำเนินการในภารกิจเพราะว่า ความเร็วในการประมวลผลไม่เร็วเท่ากับความเร็วในการรับ ซึ่งจะทำให้บัฟเฟอร์ล้น ดังนั้น Mega-Wechat จึงใช้คิวไฟล์เพื่อนำคำขอทั้งหมดไปไว้ในคิวก่อน เมื่อกระบวนการงานไม่ได้ใช้งาน คำขอจะถูกนำออก คิวและส่งมอบ ไปที่งานเพื่อประมวลผลคำขอเพื่อส่งข้อความเทมเพลต การใช้งานดังกล่าวจะไม่ทำให้เกิดบัฟเฟอร์ล้น และสามารถรองรับการทำงานพร้อมกันจำนวนมากได้ อย่างไรก็ตาม เนื่องจาก WeChat มีชุดกฎและข้อจำกัดเกี่ยวกับข้อความเทมเพลต การเรียก API จำนวนมากจึงเป็นเพียงทางทฤษฎีเท่านั้น
สถาปัตยกรรมระบบ Mega-Wechat แสดงในรูปด้านล่าง:
คำอธิบายกระบวนการดำเนินการของระบบ:
คำอธิบายข้างต้นเป็นกระบวนการแบบซิงโครนัส ซึ่งสามารถเป็นการประมวลผลแบบอะซิงโครนัสหรือแบบซิงโครนัสสำหรับไคลเอ็นต์
config/ 服务器配置
libs/
Network/
Server/
Swoole/ Mega核心类库
Wechat/ 微信API
logs/
vendor/ 支持composer,依赖monolog写日志
autoload.php
mega Mega命令入口
ขั้นตอนแรก ในการติดตั้ง PHP จำเป็นต้องมีเวอร์ชัน 5.6 ขึ้นไป เนื่องจากคิวฝั่งเซิร์ฟเวอร์ใช้ฟังก์ชัน SPL และไวยากรณ์ของคุณสมบัติใหม่ของ PHP
ขั้นตอนที่ 2 ติดตั้ง Mysql เวอร์ชันใดก็ได้
ยำติดตั้ง mysql
หลังจากการติดตั้งสำเร็จ Mysql จำเป็นต้องสร้างตาราง mega_wechat_template โครงสร้างโดยละเอียดจะแนะนำในบทถัดไป
ขั้นตอนที่ 3 ก่อนติดตั้งส่วนขยาย swole คุณต้องตรวจสอบให้แน่ใจว่าได้ติดตั้งซอฟต์แวร์ต่อไปนี้บนระบบแล้ว
php-5.3.10 หรือสูงกว่า gcc-4.4 หรือสูงกว่า สร้าง autoconf
ดาวน์โหลดที่อยู่
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
หลังจากดาวน์โหลดแพ็คเกจซอร์สโค้ดแล้ว ให้ป้อนไดเร็กทอรีซอร์สโค้ดในเทอร์มินัลแล้วดำเนินการคำสั่งต่อไปนี้เพื่อคอมไพล์และติดตั้ง
ซีดีสวูล
phpize ./configure.php
ทำ
ทำการติดตั้ง
เทมเพลต WeChat จะถูกจัดเก็บไว้ในเซิร์ฟเวอร์ Mega-Wechat เนื่องจากธุรกิจส่วนใหญ่จำเป็นต้องแก้ไขเนื้อหาของเทมเพลตบ่อยครั้ง สำหรับเทมเพลตเหล่านี้ที่จำเป็นต้องเปลี่ยนแปลงบ่อยครั้งหากเขียนลงในโปรแกรมจะไม่สะดวกอย่างยิ่ง ดังนั้น MySql จึงถูกใช้เพื่อจัดเก็บเทมเพลตและเพิ่มฟิลด์เพิ่มเติม ตามที่ธุรกิจต้องการ
สำหรับเซิร์ฟเวอร์ เทมเพลตฐานข้อมูลจะถูกแคชเมื่อเริ่มต้น หากจำเป็นต้องอัปเดตเทมเพลต จะมีคำสั่งที่เกี่ยวข้องเพื่ออัปเดตแคชเทมเพลตของเซิร์ฟเวอร์แบบเรียลไทม์ ดังนั้นจึงไม่จำเป็นต้องกังวลเกี่ยวกับความจำเป็นในการรับ เทมเพลตจากฐานข้อมูลทุกครั้งที่ส่งเทมเพลต ส่งผลให้ประสิทธิภาพลดลง
โครงสร้างตาราง:
CREATE TABLE ` mega_wechat_template ` (
` tmpl_key ` char ( 32 ) NOT NULL COMMENT '模板key ' ,
` title ` varchar ( 100 ) NOT NULL DEFAULT ' ' COMMENT '模板标题' ,
` template ` text NOT NULL COMMENT '模板内容' ,
` created_at ` int ( 11 ) NOT NULL DEFAULT ' 0 ' ,
` updated_at ` int ( 11 ) NOT NULL DEFAULT ' 0 ' ,
PRIMARY KEY ( ` tmpl_key ` )
)
คำอธิบายฟิลด์:
สนาม | แสดงให้เห็น |
---|---|
tmpl_key | คีย์เทมเพลต (เป็นพารามิเตอร์สำหรับส่งคำขอคำสั่งเทมเพลต Mega) |
ชื่อ | ชื่อเทมเพลต |
แม่แบบ | เนื้อหาเทมเพลต รูปแบบการจัดเก็บเป็น json |
สร้างขึ้น_at | เวลาสร้าง |
อัปเดต_ที่ | เวลาอัปเดต |
template字段格式,例子如下:
{
"touser" : " ${OPENID} " ,
"template_id" : " ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY " ,
"url" : " http://weixin.qq.com/download " ,
"data" :{
"first" : {
"value" : "恭喜你购买成功! " ,
"color" : " #173177 "
},
"keynote1" :{
"value" : "巧克力" ,
"color" : " #173177 "
},
"keynote2" : {
"value" : " 39.8元" ,
"color" : " #173177 "
},
"keynote3" : {
"value" : " 2014年9月22日" ,
"color" : " #173177 "
},
"remark" :{
"value" : "欢迎再次购买! " ,
"color" : " #173177 "
}
}
}
注意:JSON中的${OPENID},是自定义的变量,调用微信模板消息接口前会先解析json模板并替换相应的自定义变量。
该变量由发送Mega模板命令请求的参数定义
ไฟล์การกำหนดค่าจะถูกวางไว้อย่างสม่ำเสมอในไดเร็กทอรี config และแต่ละเซิร์ฟเวอร์มีการกำหนดค่าที่เป็นอิสระ
[server]
;启动server类
class = " ServerMegaWechatServer "
;协议类
protocol = " NetworkMegaWechatProtocol "
;主机和端口
listen[] = 127.0.0.1:9501
;缓存模板个数
table_size = 100 ;
;缓存模板内容最大size
template_size = 4048
;文件队列存储路径
queue_file_path = " /Mega-Wechat/logs/queue "
[setting]
; ;;;;;;;;;;;swoole配置;;;;;;;;;;;;;;
dispatch_mode = 2
worker_num = 2
task_worker_num = 8
open_eof_check = true
package_length_type = N
package_length_offset = 0
package_body_offset = 4
package_max_length = 2465792
daemonize = 1
; ;swoole_log文件
; log_file = "/qcloud/logs/swoole.log"
[pdo]
dsn = " mysql:host=127.0.0.1;dbname=mega "
username = root
password = i201314
table_prefix = mega_
[wechat]
app_id = wx10c4b54cf0aae125
app_secret = e01207cc547f62d73f5099aae83a9f15
token = e01207cd547f62d73f5099cae83a9f15
[log]
; ;;;;;系统log配置,基于monolog;;;;;;
log_file = /Mega-Wechat/logs/mega.log
;存储日志级别
log_level = warning
;日志前缀
log_prefix = mega
เริ่มต้นเซิร์ฟเวอร์ตามไฟล์การกำหนดค่า โดยใช้ไฟล์ .ini แต่ละไฟล์เป็นชื่อบริการและการกำหนดค่า เช่น ไฟล์การกำหนดค่า config/wechat.ini:
cd Mega-Wechat
//php mega ${配置文件名} ${cmd}
php mega wechat start //开启服务
php mega wechat stop //关闭服务
php mega wechat restart //重启服务
Mega-Wechat ใช้ TCP สำหรับการสื่อสาร และโปรโตคอลใช้การออกแบบโปรโตคอลส่วนหัวคงที่ + แพ็คเก็ตเนื้อหา รูปแบบโปรโตคอลทั่วไปมีดังนี้:
{packLength}{headerLength}{command} {params}{opaque}{bodyLength}{body}
หมายเหตุ: ช่องว่างระหว่าง {command} {params} พารามิเตอร์พารามิเตอร์แต่ละรายการจะถูกคั่นด้วยช่องว่าง
โปรโตคอลคำสั่งส่งข้อความเทมเพลต แต่ละคำสั่งแสดงถึงการส่งข้อความเทมเพลต WeChat ไคลเอนต์ส่งคำสั่งส่งไปยังเซิร์ฟเวอร์ ซึ่งจะดำเนินการ API ข้อความเทมเพลต WeChat หนึ่งครั้ง จากนั้นตอบกลับไคลเอนต์พร้อมผลลัพธ์และส่งกลับการยืนยัน ACK
คลาสที่เกี่ยวข้องคือ: NetworkSendCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选,默认为null,例子如下:
* 传入数组为:['mega' => 'wechat']
* 模板内容中包含一个${mega}自定义变量,则数组中的mega值会替换到相应变量中。
* @param $fd int 客户端标志,可选,默认为null
*/
new SendCommand ( $ opaque , $ openid , $ key , $ data , $ fd )
ข้อความเทมเพลตที่เข้าคิวโปรโตคอลคำสั่ง หลังจากได้รับคำสั่ง เซิร์ฟเวอร์จะเข้าร่วมคิวทันทีและตอบกลับด้วยการยืนยัน ACK จากนั้นจะดำเนินการประมวลผลข้อความเทมเพลต WeChat หลังจากเข้าคิวตามคิว
คลาสที่เกี่ยวข้องคือ: NetworkPushCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选
*/
new PushCommand ( $ opaque , $ openid , $ key , $ data )
ตั้งค่าโปรโตคอลคำสั่งแคชเทมเพลต หลังจากได้รับคำสั่งนี้ เซิร์ฟเวอร์จะรับเนื้อหาเทมเพลตจากฐานข้อมูลตามคีย์และแคชไว้ในหน่วยความจำ หากไม่มีคีย์หรือเกินขนาดแคช เซิร์ฟเวอร์จะตอบกลับพร้อมข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง
คลาสที่สอดคล้องกันคือ: NetworkSetTableCommand
/**
* @param $opaque int 发送序号
* @param $key string 模板key
* @param $fd int 客户端标志,客户端发送命令时可为null
*/
new SetTableCommand ( $ opaque , $ key , $ fd )
โปรโตคอลคำสั่งตอบสนองทั่วไป ส่งคืนผลลัพธ์การร้องขอ โปรโตคอลนี้สามารถใช้เป็นการยืนยัน ACK และเป็นการตอบสนองต่อคำขอล่าสุดโดยยึดตามค่าทึบแสงที่ส่งคืน รหัสที่ส่งคืนจะถูกใช้เป็นรหัสตอบกลับ โดยใช้ซีแมนทิกส์เดียวกันกับรหัสสถานะการตอบกลับของโปรโตคอล HTTP หากการตอบกลับเป็นข้อผิดพลาด โดยปกติช่องข้อความจะรวมอยู่ด้วย ตัวอย่างเช่น หากไม่สามารถส่งคำสั่งส่งได้ รหัสตอบกลับจะเป็น 400 และข้อความจะเป็น json ที่อินเทอร์เฟซข้อความเทมเพลต WeChat ส่งกลับเป็นการตอบกลับ
คลาสที่เกี่ยวข้องคือ: NetworkBooleanCommand
/**
* @param $code int 应答状态码
* @param $message string 消息内容
* @param $opaque int 应答序号
*/
new BooleanCommand ( $ code , $ message , $ opaque )
อย่างแรกคือการใช้โปรโตคอล Send และอีกอันคือโปรโตคอล Push ซึ่งทั้งสองอย่างนี้สามารถรับมือกับสถานการณ์ที่แตกต่างกันได้
โปรโตคอล Push ใช้เป็นหลักสำหรับการใช้งานที่ไม่ต้องการรอให้ WeChat เรียก API โดยเฉพาะอย่างยิ่ง Push จะนำแต่ละข้อความเทมเพลตไปไว้ในคิว และเซิร์ฟเวอร์จะตอบกลับทันที ในเวลานี้ ไคลเอ็นต์สามารถดำเนินการตรรกะทางธุรกิจต่อไปได้โดยไม่ต้องสนใจว่าข้อความเทมเพลตจะสำเร็จหรือไม่ (ฝั่งเซิร์ฟเวอร์สามารถรับประกันได้ว่าจะใช้ข้อความนี้)
โปรโตคอลการส่งยังส่งข้อความเทมเพลตอีกด้วย ต่างจาก Push ตรงที่เซิร์ฟเวอร์จะตอบกลับด้วยผลลัพธ์หลังจากเรียก API ข้อความเทมเพลต WeChat หลังจากได้รับการตอบกลับ ลูกค้าสามารถรับผลลัพธ์ที่ส่งได้ (การตอบกลับคือโปรโตคอลผลลัพธ์ รหัสที่ส่งคืนคือ 200 หากสำเร็จ และรหัส 400 จะถูกส่งคืนหากล้มเหลว และข้อความคือ json ของผลลัพธ์ที่ส่งคืนโดย WeChat) จากผลลัพธ์ ลูกค้าสามารถดำเนินธุรกิจที่เกี่ยวข้องได้
มีปัญหาหลายประการกับโปรโตคอลการส่ง:
เมื่อเปรียบเทียบกับปัญหาข้างต้น ข้อดีของโปรโตคอลนี้คือสามารถทราบผลลัพธ์ของการส่ง และสามารถควบคุมตรรกะทางธุรกิจว่าจะส่งข้อความถัดไปต่อไปหรือไม่
สถานการณ์จริง: หากคุณต้องการส่งข้อความเทมเพลตเป็นชุดไปยังกลุ่มผู้ใช้ที่ระบุหรือผู้ใช้ทั้งหมด คุณสามารถใช้โปรโตคอลนี้เพื่อให้บรรลุเป้าหมายนี้ได้ การส่งข้อความเทมเพลตเป็นชุดให้กับผู้ใช้ถือเป็นงานหนึ่งงานประกอบด้วยข้อมูล เช่น จำนวนข้อความที่ส่ง จำนวนความสำเร็จ จำนวนความล้มเหลว คีย์เทมเพลต ฯลฯ ตรรกะทางธุรกิจของการส่ง รับ และบันทึกกระบวนการส่งจะดำเนินการผ่านไคลเอนต์ การตอบสนองของเซิร์ฟเวอร์แต่ละครั้งจะถูกใช้เป็นพื้นฐานสำหรับความสำเร็จหรือความล้มเหลวของการอัปเดต กระบวนการทางธุรกิจเฉพาะมีดังนี้:
ขอแนะนำให้ใช้ไคลเอ็นต์แบบอะซิงโครนัส Swoole เพื่อใช้ตรรกะทางธุรกิจข้างต้น หลังจากรันแล้ว ไคลเอ็นต์สามารถรันในเบื้องหลังเป็นกระบวนการ daemon ได้ โดยสามารถปิดได้ด้วย kill เมื่อจำเป็นต้องดำเนินการให้เสร็จสิ้น
สิ่งที่แนบมาคือการแสดงผลการใช้งานไคลเอนต์:
ในที่สุด มีการแนบ github ไคลเอ็นต์โอเพ่นซอร์ส DEMO: https://github.com/imRainChen/Mega-WeChat-Client
หากคุณมีข้อเสนอแนะใด ๆ โปรดติดต่อเราและคุณยังสามารถโพสต์คำถามและข้อเสนอแนะได้
อีเมล์: [email protected]
Apache License เวอร์ชัน 2.0 ดู http://www.apache.org/licenses/LICENSE-2.0.html