C++做后端网站开发问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuxinli1025
V2EX    C

C++做后端网站开发问题

  •  
  •   wuxinli1025 2016-09-19 17:58:48 +08:00 4442 次点击
    这是一个创建于 3365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端选择没有限制, 但是用户输入检测, 插入到数据库, 各种涉及计算的任务必须有 C++后端完成。 而且, 后端要是一个完整的程序, 不能每个功能写一个 cgi , 比如说用户注册 /登陆 /发帖等功能需是这个完整程序的不同 function 。

    目前的想法是: 前端 html/jsvascript 然后吧用户输入的数据 cgi 提交到 C++, 然后由 C++检测后提交到数据库。 但是网站有很多功能, 用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端还在运行哦, 但点击提交后难道要再运行这个后端去插到数据库里?!!! 这种法简直不能再奇怪了好吗。 感觉 cgi 根本不是为建设全站设计的。 有没有其他的办法, 试过了 Wt , 太难用没教程文档少。 还是学生, 求大神指点一二。

    谢谢。

    第 1 条附言    2016-09-19 19:51:47 +08:00
    澄清:
    1.用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端(输出页面的这个 cgi)还在运行哦
    2.可以 Java , 但是不倾向
    3.要是没个功能都重新运行一下 cgi , 我要怎么做返回页面?
    第 2 条附言    2016-09-20 18:54:10 +08:00
    如果前端用 HTML+jquery+php , 有没有好的办法让 c++了解系统的 state(比如说记住当前的用户)
    44 条回复    2016-09-21 10:03:05 +08:00
    kokutou
        1
    kokutou  
       2016-09-19 18:02:52 +08:00 via Android
    好像有人做了个 c++的网站。。。好快好快。。。
    qinxi
        2
    qinxi  
       2016-09-19 18:04:18 +08:00
    这么简单的需求为啥不换一个更方便的语言? 比如 "PHP 是最好的语言"
    saberlion
        3
    saberlion  
       2016-09-19 19:11:49 +08:00
    想法不奇怪。。
    pi1ot
        4
    pi1ot  
       2016-09-19 19:19:55 +08:00
    为什么“后端要是一个完整的程序, 不能每个功能写一个 cgi ”?
    andyhuzhill
        5
    andyhuzhill  
       2016-09-19 19:20:14 +08:00
    CppCMS  怎么样?
    azh7138m
        6
    azh7138m  
       2016-09-19 19:34:01 +08:00
    然后就写了个解析器,结果越改越像 php....
    wuxinli1025
        7
    wuxinli1025  
    OP
       2016-09-19 19:34:47 +08:00
    @qinxi 要求啊 必须 C++/Java
    wuxinli1025
        8
    wuxinli1025  
    OP
       2016-09-19 19:36:50 +08:00
    @pi1ot 要求, 要开发整体系统
    wuxinli1025
        9
    wuxinli1025  
    OP
       2016-09-19 19:38:12 +08:00
    @kokutou 可否给个链接, 谢谢
    fatedier
        10
    fatedier  
       2016-09-19 19:38:37 +08:00
    教学练习?
    wuxinli1025
        11
    wuxinli1025  
    OP
       2016-09-19 19:39:14 +08:00
    @fatedier 是的
    halfcoder
        12
    halfcoder  
       2016-09-19 19:40:57 +08:00
    我看了好几遍还是没有理清楚你到底是要在什么环境下实现这些功能?
    既然你提到 cgi ,那么我假定你是用 apache 等作为 http 服务器, c++只是写的后端逻辑。那么:
    不能每个功能写个 cgi ?单个 cgi 检查 querystring 再调用具体函数执行,就相当于自己写个 router
    “用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端还在运行哦” apache 难道不是一直在运行的么?“后端”到底是个啥?
    wuxinli1025
        13
    wuxinli1025  
    OP
       2016-09-19 19:47:12 +08:00
    apache 是一直在运行。不允许每个功能写个 cgi 。 用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端(输出页面的这个 cgi)还在运行哦
    xylophone21
        14
    xylophone21  
       2016-09-19 19:49:40 +08:00
    多进程
    fatedier
        15
    fatedier  
       2016-09-19 19:51:17 +08:00
    @wuxinli1025 https://github.com/ipkn/crow 还是有一些类似这样的 web 框架,没必要用 cgi 吧。而且 c++ 写 web 感觉太受罪,还是用 Java 吧。
    giuem
        16
    giuem  
       2016-09-19 19:51:21 +08:00
    @wuxinli1025 https://github.com/typcn/LeanClub 这有一个 C++ 写的论坛
    soli
        17
    soli  
       2016-09-19 20:16:18 +08:00
    楼主想多了。其实没那么复杂。

    把 HTTP 协议和 Fast-CGI 协议吃个半透就没问题了。
    bramblex
        18
    bramblex  
       2016-09-19 20:25:52 +08:00
    1. 从问题描述来看,楼主你是不是根本没有任何 web 开发开发的相关经验和知识?
    2. 如果一定要 C++ 楼上的 crow 还不错,至少比 java 的那套东西方便多了
    3. 关于登陆问题,自行 google 一下 cookies 。反正你做出来的东西不是实用的,直接把登陆信息明文写进 cookies 里面就行了。
    4. 大胆猜测一下,这是楼主计算机网络或者是数据库的大作业吧?
    wuxinli1025
        19
    wuxinli1025  
    OP
       2016-09-19 20:37:22 +08:00
    @bramblex 哈哈哈哈 系统开发的大作业
    wuxinli1025
        20
    wuxinli1025  
    OP
       2016-09-19 20:38:31 +08:00
    @bramblex 竟然忘了可以用 cookies , 哈哈哈哈
    bramblex
        21
    bramblex  
       2016-09-19 20:52:30 +08:00
    @wuxinli1025

    反正你准备前后端分离嘛,那干脆模板引擎都不要了,前后端直接 JSON 交互。然后前端完全做成单页应用就好了。
    wuxinli1025
        22
    wuxinli1025  
    OP
       2016-09-19 21:12:24 +08:00
    @bramblex 我也是这样想的, 人懒嘛。 获取数据用 JSON 或者 PHP 都比较简单,提交数据用 cgi 。
    但之前设计了那么多各种 diagrams , 整体上来看各个功能都是属于整体系统的一部分, 按道理讲应该用很多 class 和成员函数。 后端应该对当前系统的 state 有所了解。 如果做成 JSON 的话整个系统看起来岂不是很垃圾?
    可老师又说对前端没有要求, 但又说要用 entity class/control class/boundary class , 那意思是不是 entity class 要放后端? 如果前端没要求可以 html/js 的话, entity class 放后端有何用?用来占行数的吗? 还是我理解错了, 比如把当前用户存在 cookies 里也算用到 entity class 了?
    大神你觉得呢?
    veelog
        23
    veelog  
       2016-09-19 21:15:55 +08:00 via Android
    nginx 扩展 c++
    halfcoder
        24
    halfcoder  
       2016-09-19 21:54:16 +08:00
    @wuxinli1025
    > 用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端(输出页面的这个 cgi)还在运行哦

    你确定?
    jimzhong
        25
    jimzhong  
       2016-09-19 22:14:41 +08:00
    如果你只想得到一个可执行文件,那么要么在这个文件中实现一个 HTTP 服务器,要么像 php 一样把路径作为 GET 的参数传给你的程序,在程序里面写一个函数判断要调用哪个函数。

    还有一个方法是你给这个文件建立好多软连接,然后通过 argv[0]判断调用它的名字, busybox 是这么做的。
    建议使用 session 保存状态。

    建议 lz 阅读一下 CGI 的规范,我记得 CGI 输出东西后是要 exit 的。 HTTP 服务器是肯定在一直运行的。

    如果前后端分离,建议使用 JSON ,前端可以做成 SPA ,而不是让后端输出一个 html 出来。
    GentleSadness
        26
    GentleSadness  
       2016-09-19 22:19:28 +08:00
    @kokutou 不是说瓶颈在网络速度吗
    wizardoz
        27
    wizardoz  
       2016-09-19 22:32:35 +08:00
    有很多办法可以解决你说的问题,比方说 CGI 程序和常驻进程通过消息队列通信或者 CGI 程序通过远程过程调用和常驻进程通信。

    但是楼主既然问得出这样的问题,为什么一定要使用 C++来实现?
    wizardoz
        28
    wizardoz  
       2016-09-19 22:36:12 +08:00
    不好意思,没看到 LZ 说的必须选择 C++和 Java ,忽略我刚刚说的。
    bramblex
        29
    bramblex  
       2016-09-19 22:44:09 +08:00
    @wuxinli1025

    http 是本来就是无状态链接,企图用来维持当前的 state 是不科学的。除了一些高实时的应用场景,否则一般不会维持状态。你把你带状态的部分扔前端去就好了,把后端就当成一个存取数据的地方就行了。
    wuxinli1025
        30
    wuxinli1025  
    OP
       2016-09-19 23:02:44 +08:00
    @halfcoder 貌似所错了, 输出完页面后 cgi 应该终止了的。 但是还是觉得整个实现方法奇奇怪怪的。
    wuxinli1025
        31
    wuxinli1025  
    OP
       2016-09-19 23:04:02 +08:00
    @halfcoder 可以终止也可以不终止嘛, 看情况啦
    wind3110991
        32
    wind3110991  
       2016-09-19 23:08:38 +08:00
    我觉得。。。过度纠结于一门语言不适用的方向,还不如花心思提高其他地方,比如如何优化 DB 查询和服务器性能、优化数据缓存、优化系统架构等等, C++的优势本身在于能够从底层全局地解决问题,并且稳定地支撑系统运行。用 C++做网络层和传输层的工作,应用层结合一个 web app 框架不挺好的吗,封装传输数据,并且保证请求不会有问题,干嘛那么折腾 = =
    fluyy
        33
    fluyy  
       2016-09-20 00:19:00 +08:00
    看你的描述,你要写一个 HTTP 服务器。。。或者用 c++为现有的一些服务器开发写扩展。
    如果是老师的大作业,要自己开发, 那么简单点起一个守护进程监听 80 端口,有数据过来,就按照 http 的格式去解析, 根据解析出来的 url 去路由到对应的 class 上去。 如果是大作业,什么多线程多进程 select 模型都用考虑了。。。。
    如果不是大作业,没有成熟的框架久不要用 c++写了吧。 python 多好用。
    SlipStupig
        34
    SlipStupig  
       2016-09-20 00:23:48 +08:00
    @veelog 强烈同意用 nginx+lua 扩展马上做完作业
    pi1ot
        35
    pi1ot  
       2016-09-20 09:01:08 +08:00
    @wuxinli1025 完全不理解的你说的所谓整体系统是个什么意思,什么定义,什么需求,麻烦换成行内术语描述。
    wuxinli1025
        36
    wuxinli1025  
    OP
       2016-09-20 09:12:12 +08:00 via iPhone
    @pi1ot 后端要是单个可执行文件
    hcymk2
        37
    hcymk2  
       2016-09-20 09:24:47 +08:00
    @wuxinli1025
    单个可执行文件 可以用 go
    qinxi
        38
    qinxi  
       2016-09-20 09:29:45 +08:00
    @wuxinli1025 可以 java 啊 ..那也简单啊...spring boot 可以 以 jar 的方式运行服务
    halfcoder
        39
    halfcoder  
       2016-09-20 09:48:39 +08:00
    @wuxinli1025 我觉得 cgi 处理完请求输出页面 /结果之后应该是要退出的, cgi 是一个 fork-execute 模型,不退出挺奇怪的。
    注意 HTTP 的设计是无状态的,即使保持 session 也是服务端自己的机制保证一个访问来源在一段时间的状态数据,不是 HTTP 的设计。所以你在充分理解 HTTP 协议机制和 cgi 执行流程之后再来考虑这个怎么设计会比较清晰一点。
    pi1ot
        40
    pi1ot  
       2016-09-20 10:33:48 +08:00
    @wuxinli1025 很奇怪的需求,不过你自己写一个完整的 http server 也可以满足
    zxiso
        41
    zxiso  
       2016-09-20 12:37:35 +08:00 via Android
    cpprestsdk 。不过这个东西文档有点少。。
    qichunren
        42
    qichunren  
       2016-09-20 12:47:49 +08:00
    我使用 mongoose 这个库(就一个 mongoose.h 和 mongoose.c 文件)做 WEB 服务,感觉还不错。
    skydiver
        43
    skydiver  
       2016-09-20 14:51:52 +08:00
    用 libuv 和 http_parser 写个简单的 http 服务很容易的,性能也很高。前面 nginx 反向代理一下就行了
    huage
        44
    huage  
       2016-09-21 10:03:05 +08:00
    一个语言或者工具有它适合的用途,不要违背这些东西
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1119 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 17:55 PVG 01:55 LAX 09:55 JFK 12:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86