年度收尾 C++ Web 框架 Paozhu 1.5.4 版,支持 PHP、HTTP2 稳定百万压测
C++ Web框架Paozhu,发布一年,经过几次不停重构,目前百万压测没有问题。
1.5.4版,大范围重构、代码更加现代化和稳定,全球几乎唯一自己开发解析http2协议的C++框架,跟系统高度集成没有性能开销。
作为新的一代服务器容器程序,Paozhu可以承担PHP开发迁移,老代码可以不动,新业务使用C++20等现代快速开发,Paozhu 使用FastCGI+PHP-FPM方式,C++20完善,开发速度也可以比肩脚本语言,加上三大编译器支持内存泄漏检查asan,能过编译器,运行起来就没有问题,有问题可以自动定位。
Paozhu C++ Web框架 内置强大的C++ ORM模块,简单易用,自动从数据库生成ORM实体类,内置分页,几行代码可以代替Java几百行代码。
Paozhu C++ Web框架经典内容列表,包括搜索、分页程序,鉴权等
//@urlpath(admin_islogin,admin/listarticle)
std::string admin_listarticle(std::shared_ptr<httppeer> peer)
{
httppeer &client = peer->getpeer();
try
{
auto topicm = orm::cms::Topic();
topicm.where("userid", client.session["userid"].to_int()).asc("parentid").fetch();
unsigned int topicid = client.get["topicid"].to_int();
unsigned int page = client.get["page"].to_int();
std::string searchword = client.get["searchword"].to_string();
searchword = mb_substr(searchword, 0, 15);
client.val["topicid"] = topicid;
client.val["list"].set_array();
OBJ_ARRAY temp;
std::map<unsigned int, std::string> topickv;
std::vector<unsigned int> topic_id_array;//articles under this topic and sub topics
if (topicid > 0)
{
topic_id_array.push_back(topicid);
}
for (unsigned int i = 0; i < topicm.record.size(); i++)
{
temp["id"] = topicm.record[i].topicid;
temp["parentid"] = topicm.record[i].parentid;
temp["value"] = topicm.record[i].title;
client.val["list"].push(temp);
topickv[topicm.record[i].topicid] = topicm.record[i].title;
if (topicid > 0)
{
for (unsigned int j = 0; j < topic_id_array.size(); j++)
{
if (topicm.record[i].parentid == topic_id_array[j])
{
topic_id_array.push_back(topicm.record[i].topicid);
}
}
}
}
auto artmodel = orm::cms::Article();
artmodel.where("userid", client.session["userid"].to_int());
if (topicid > 0)
{
std::string topicid_sql_str = array_to_sql(topic_id_array);
if (topicid_sql_str.size() > 0)
{
artmodel.whereIn("topicid", topicid_sql_str);
}
}
if (searchword.size() > 0)
{
artmodel.andsub().whereLike("title", str_addslash(searchword));
artmodel.whereOrLike("content", str_addslash(searchword)).andsub();
client.val["searchword"] = searchword;
}
auto [bar_min, bar_max, current_page, total_page] = artmodel.page(page, 10, 5);
client.val["pageinfo"].set_array();
client.val["pageinfo"]["min"] = bar_min;
client.val["pageinfo"]["max"] = bar_max;
client.val["pageinfo"]["current"] = current_page;
client.val["pageinfo"]["total"] = total_page;
artmodel.select("aid,topicid,title,createtime,sortid,isopen").desc("aid").fetch();
client.val["alist"].set_array();
OBJ_ARRAY tempa;
if (artmodel.size() > 0)
{
for (auto &item : artmodel)
{
tempa["title"] = item.title;
tempa["aid"] = item.aid;
tempa["date"] = item.createtime.substr(0, 10);
tempa["topicname"] = topickv[item.topicid];
tempa["sortid"] = item.sortid;
tempa["isopen"] = item.isopen;
client.val["alist"].push(tempa);
}
}
}
catch (std::exception &e)
{
client.val["code"] = 1;
}
peer->view("admin/listarticle");
return "";
}
1.特性🔥🔥🔥🔥🔥
✅ 1. 自带json编解码不用第三方库,标准json支持
✅ 2. 支持多域名网站
✅ 3. 支持多域名ssl 服务端
✅ 4. 支持http/1.1、http/2协议
✅ 5. 支持websocket服务端
✅ 6. 框架自带websocket推送,支持定时推送到webscoket客户端
✅ 7. 支持httpclient get post,同步异步、协程模式,数据采集
✅ 8. 框架自带ORM,使用链接池方式,目前支持mysql
✅ 9. 框架自带线程池,和用户代码运行的线程池
✅10. 框架使用asio自带的协程
✅11. 框架特色是I/O 使用协程池 用户代码运行使用线程池,类似GO那种调度,只是针对http请求调度
✅12. 框架支持普通文件gzip、br,并支持缓存到磁盘,下次不用cpu再压缩
✅13. URL、POST和上传文件,解析结果client.get[] client.post[] client.files[]方式获取内容
✅14. 自带sendmail类库
✅15. 生成二维码(qrcode),需要gd、qrencode库
✅16. 插件化编程,热动态更新,使用动态库方式
✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力
✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智
✅19. 结构和类注解JSON功能,使用json_encode json_decode操作复杂C++结构体和JSON互转,可以参考Wiki
✅20. 提供一个完整admin后台管理框架(见后面图片), 访问URL为 /admin/main
✅21. 支持PHP-FPM fastcgi运行模式,代替Apache做PHP前端,让PHP程序员平稳过渡到 C++ 开发模式
https://github.com/hggq/paozhu