前端选择没有限制, 但是用户输入检测, 插入到数据库, 各种涉及计算的任务必须有 C++后端完成。 而且, 后端要是一个完整的程序, 不能每个功能写一个 cgi , 比如说用户注册 /登陆 /发帖等功能需是这个完整程序的不同 function 。
目前的想法是: 前端 html/jsvascript 然后吧用户输入的数据 cgi 提交到 C++, 然后由 C++检测后提交到数据库。 但是网站有很多功能, 用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端还在运行哦, 但点击提交后难道要再运行这个后端去插到数据库里?!!! 这种想法简直不能再奇怪了好吗。 感觉 cgi 根本不是为建设全站设计的。 有没有其他的办法, 试过了 Wt , 太难用没教程文档少。 还是学生, 求大神指点一二。
谢谢。
1
kokutou 2016-09-19 18:02:52 +08:00 via Android
好像有人做了个 c++的网站。。。好快好快。。。
|
2
qinxi 2016-09-19 18:04:18 +08:00
这么简单的需求为啥不换一个更方便的语言? 比如 "PHP 是最好的语言"
|
3
saberlion 2016-09-19 19:11:49 +08:00
想法不奇怪。。
|
4
pi1ot 2016-09-19 19:19:55 +08:00
为什么“后端要是一个完整的程序, 不能每个功能写一个 cgi ”?
|
5
andyhuzhill 2016-09-19 19:20:14 +08:00
CppCMS 怎么样?
|
6
azh7138m 2016-09-19 19:34:01 +08:00
然后就写了个解析器,结果越改越像 php....
|
7
wuxinli1025 OP @qinxi 要求啊 必须 C++/Java
|
8
wuxinli1025 OP @pi1ot 要求, 要开发整体系统
|
9
wuxinli1025 OP @kokutou 可否给个链接, 谢谢
|
10
fatedier 2016-09-19 19:38:37 +08:00
教学练习?
|
11
wuxinli1025 OP @fatedier 是的
|
12
halfcoder 2016-09-19 19:40:57 +08:00
我看了好几遍还是没有理清楚你到底是要在什么环境下实现这些功能?
既然你提到 cgi ,那么我假定你是用 apache 等作为 http 服务器, c++只是写的后端逻辑。那么: 不能每个功能写个 cgi ?单个 cgi 检查 querystring 再调用具体函数执行,就相当于自己写个 router “用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端还在运行哦”—— apache 难道不是一直在运行的么?“后端”到底是个啥? |
13
wuxinli1025 OP apache 是一直在运行。不允许每个功能写个 cgi 。 用户登录后要发贴, 没问题 cgi 输出发帖页面的,这个时候后端(输出页面的这个 cgi)还在运行哦
|
14
xylophone21 2016-09-19 19:49:40 +08:00
多进程
|
15
fatedier 2016-09-19 19:51:17 +08:00
@wuxinli1025 https://github.com/ipkn/crow 还是有一些类似这样的 web 框架,没必要用 cgi 吧。而且 c++ 写 web 感觉太受罪,还是用 Java 吧。
|
16
giuem 2016-09-19 19:51:21 +08:00
@wuxinli1025 https://github.com/typcn/LeanClub 这有一个 C++ 写的论坛
|
17
soli 2016-09-19 20:16:18 +08:00
楼主想多了。其实没那么复杂。
把 HTTP 协议和 Fast-CGI 协议吃个半透就没问题了。 |
18
bramblex 2016-09-19 20:25:52 +08:00
1. 从问题描述来看,楼主你是不是根本没有任何 web 开发开发的相关经验和知识?
2. 如果一定要 C++ 楼上的 crow 还不错,至少比 java 的那套东西方便多了 3. 关于登陆问题,自行 google 一下 cookies 。反正你做出来的东西不是实用的,直接把登陆信息明文写进 cookies 里面就行了。 4. 大胆猜测一下,这是楼主计算机网络或者是数据库的大作业吧? |
19
wuxinli1025 OP @bramblex 哈哈哈哈 系统开发的大作业
|
20
wuxinli1025 OP @bramblex 竟然忘了可以用 cookies , 哈哈哈哈
|
21
bramblex 2016-09-19 20:52:30 +08:00
|
22
wuxinli1025 OP @bramblex 我也是这样想的, 人懒嘛。 获取数据用 JSON 或者 PHP 都比较简单,提交数据用 cgi 。
但之前设计了那么多各种 diagrams , 整体上来看各个功能都是属于整体系统的一部分, 按道理讲应该用很多 class 和成员函数。 后端应该对当前系统的 state 有所了解。 如果做成 JSON 的话整个系统看起来岂不是很垃圾? 可老师又说对前端没有要求, 但又说要用 entity class/control class/boundary class , 那意思是不是 entity class 要放后端? 如果前端没要求可以 html/js 的话, entity class 放后端有何用?用来占行数的吗? 还是我理解错了, 比如把当前用户存在 cookies 里也算用到 entity class 了? 大神你觉得呢? |
23
veelog 2016-09-19 21:15:55 +08:00 via Android
nginx 扩展 c++
|
24
halfcoder 2016-09-19 21:54:16 +08:00
|
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 出来。 |
26
GentleSadness 2016-09-19 22:19:28 +08:00
@kokutou 不是说瓶颈在网络速度吗
|
27
wizardoz 2016-09-19 22:32:35 +08:00
有很多办法可以解决你说的问题,比方说 CGI 程序和常驻进程通过消息队列通信或者 CGI 程序通过远程过程调用和常驻进程通信。
但是楼主既然问得出这样的问题,为什么一定要使用 C++来实现? |
28
wizardoz 2016-09-19 22:36:12 +08:00
不好意思,没看到 LZ 说的必须选择 C++和 Java ,忽略我刚刚说的。
|
29
bramblex 2016-09-19 22:44:09 +08:00
@wuxinli1025
http 是本来就是无状态链接,企图用来维持当前的 state 是不科学的。除了一些高实时的应用场景,否则一般不会维持状态。你把你带状态的部分扔前端去就好了,把后端就当成一个存取数据的地方就行了。 |
30
wuxinli1025 OP @halfcoder 貌似所错了, 输出完页面后 cgi 应该终止了的。 但是还是觉得整个实现方法奇奇怪怪的。
|
31
wuxinli1025 OP @halfcoder 可以终止也可以不终止嘛, 看情况啦
|
32
wind3110991 2016-09-19 23:08:38 +08:00
我觉得。。。过度纠结于一门语言不适用的方向,还不如花心思提高其他地方,比如如何优化 DB 查询和服务器性能、优化数据缓存、优化系统架构等等, C++的优势本身在于能够从底层全局地解决问题,并且稳定地支撑系统运行。用 C++做网络层和传输层的工作,应用层结合一个 web app 框架不挺好的吗,封装传输数据,并且保证请求不会有问题,干嘛那么折腾 = =
|
33
fluyy 2016-09-20 00:19:00 +08:00
看你的描述,你要写一个 HTTP 服务器。。。或者用 c++为现有的一些服务器开发写扩展。
如果是老师的大作业,要自己开发, 那么简单点起一个守护进程监听 80 端口,有数据过来,就按照 http 的格式去解析, 根据解析出来的 url 去路由到对应的 class 上去。 如果是大作业,什么多线程多进程 select 模型都用考虑了。。。。 如果不是大作业,没有成熟的框架久不要用 c++写了吧。 python 多好用。 |
34
SlipStupig 2016-09-20 00:23:48 +08:00
@veelog 强烈同意用 nginx+lua 扩展马上做完作业
|
35
pi1ot 2016-09-20 09:01:08 +08:00
@wuxinli1025 完全不理解的你说的所谓整体系统是个什么意思,什么定义,什么需求,麻烦换成行内术语描述。
|
36
wuxinli1025 OP @pi1ot 后端要是单个可执行文件
|
37
hcymk2 2016-09-20 09:24:47 +08:00
@wuxinli1025
单个可执行文件 可以用 go |
38
qinxi 2016-09-20 09:29:45 +08:00
@wuxinli1025 可以 java 啊 ..那也简单啊...spring boot 可以 以 jar 的方式运行服务
|
39
halfcoder 2016-09-20 09:48:39 +08:00
@wuxinli1025 我觉得 cgi 处理完请求输出页面 /结果之后应该是要退出的, cgi 是一个 fork-execute 模型,不退出挺奇怪的。
注意 HTTP 的设计是无状态的,即使保持 session 也是服务端自己的机制保证一个访问来源在一段时间的状态数据,不是 HTTP 的设计。所以你在充分理解 HTTP 协议机制和 cgi 执行流程之后再来考虑这个怎么设计会比较清晰一点。 |
40
pi1ot 2016-09-20 10:33:48 +08:00
@wuxinli1025 很奇怪的需求,不过你自己写一个完整的 http server 也可以满足
|
41
zxiso 2016-09-20 12:37:35 +08:00 via Android
cpprestsdk 。不过这个东西文档有点少。。
|
42
qichunren 2016-09-20 12:47:49 +08:00
我使用 mongoose 这个库(就一个 mongoose.h 和 mongoose.c 文件)做 WEB 服务,感觉还不错。
|
43
skydiver 2016-09-20 14:51:52 +08:00
用 libuv 和 http_parser 写个简单的 http 服务很容易的,性能也很高。前面 nginx 反向代理一下就行了
|
44
huage 2016-09-21 10:03:05 +08:00
一个语言或者工具有它适合的用途,不要违背这些东西
|