我知道由于 C++ 不是动态的,因此它并不是构建网站的特别好的基础,但我相信它在一定程度上会受到支持。是否有任何服务器像根一样运行 C++ 程序,例如 node.js 创建服务器,然后处理所有到达根的请求,但 CGI(我不想使用)就像一个 Php 网页,有限通过烦人的重写来减慢 Apache。是否有任何 C++ 库可以让您轻松嵌入服务器。
2 回答
我最近(就像两天前一样)不得不用 C++ 重写一个 Java Jetty servlet(由于我也在使用 OpenCV 的一些 JNI 问题)。我和你有完全相同的问题,没有简单的答案(我也不想使用 CGI)。我建议几件事:
使用升压,使用升压,使用升压。
Boost使跨平台部署变得非常简单而且(我敢说)很有趣!我的开发机器运行的是 Windows 7,但我不得不将服务器部署在 Linux 服务器上,并且 boost 让它变得非常容易。
使用 HTTP 库
对于我的项目,我发现了cpp-netlib,它使编写 servlet(如果你甚至可以这样称呼它们)变得非常容易。它提供对对象的访问request
,response
甚至支持多线程。这是他们网站上的服务器示例:
#include <boost/network/protocol/http/server.hpp>
#include <string>
#include <iostream>
namespace http = boost::network::http;
struct hello_world;
typedef http::server<hello_world> server;
struct hello_world {
void operator() (server::request const &request,
server::response &response) {
std::string ip = source(request);
response = server::response::stock_reply(
server::response::ok, std::string("Hello, ") + ip + "!");
}
};
int
main(int argc, char * argv[]) {
if (argc != 3) {
std::cerr << "Usage: " << argv[0] << " address port" << std::endl;
return 1;
}
try {
hello_world handler;
server server_(argv[1], argv[2], handler);
server_.run();
}
catch (std::exception &e) {
std::cerr << e.what() << std::endl;
return 1;
}
return 0;
}
非常整洁,而且(据我所见)它也非常健壮。不要(不要)编写自己的 HTTP 1.x 实现。我强烈建议不要这样做,因为这是一项巨大的时间投资,没有理由重新发明轮子。
做对你
有用的事情 如果你需要你的服务器有一些可热交换的部分,请随意使用像 LUA 这样简单的脚本语言——否则,只需准备好在每次迭代时进行编译。
我知道因为 C++ 不是动态的
不是,这意味着您为站点编写的任何代码都必须以与服务器的软件包和操作系统兼容的方式编译,并且每次更改时都重新编译。您可能不想在生产服务器上重新编译,因此您可能有另一个相同服务器的开销(您可能已经拥有用于测试的服务器,这将使其成为非问题)。
当您需要性能时,您可以用 C 或 C++ 编写 CGI 脚本。有一些库可以简化这一点,您应该能够找到教程(快速谷歌搜索找到了这个)。
在某些情况下,您还可以编写模块来扩展您的脚本语言。我知道 PHP 主要是在下面的 C 中实现的,而且我相信大多数其他脚本语言都允许添加 C 模块(C++ 可能有点困难,但应该小心或使用包装器来实现)。你可以调查一下。
我不建议将 Qt 用于站点,它似乎并不是真的为此而设计的,并且可能会携带很多您不需要的东西。如果你走这条路,更简单的 C/C++ 会更好(更快)。
与脚本语言相比(有点意见),您可能会期望精心编写和优化的 C/C++ 速度更快,内存使用更少,但一开始可能会更难编写,稍后修改和可能调试。但是,如果您的问题需要,这是一个可行的选择。