有人可以从golang关于CGI的文档中解释这段摘录:
” 请注意,使用CGI意味着启动一个新进程来处理每个请求,这通常比使用长时间运行的服务器效率低。该软件包主要用于与现有系统兼容。 “
我使用CGI进行数据库放置和获取。
这效率低吗?我应该使用“长时间运行的服务器”吗?
如果是这样,那是什么意思,我该如何实现呢?
答案 0 :(得分:2)
是的,效率低下。启动整个新流程的成本通常不仅仅是连接到已经存在的流程,或者在当前流程中的某个线程上执行某些操作。
就是否有必要而言,这取决于。如果您正在创建一个与Google竞争的搜索引擎,我建议CGI 不的方式。
如果是每小时访问一次的个人网站,我认为你可能会侥幸逃脱。
就长时间运行的服务器而言,您通常可以编写类似于一直运行的Web服务器的插件,Web服务器只在需要时将请求传递给它(可能还有多个线程“它“)。
这样,它一直就绪,您不必等待Web服务器启动另一个进程来处理请求。
事实上,Apache本身通过一个模块(如插件)进行CGI,该模块在运行时将自身集成到Apache中 - 外部进程的实际调用由从模块处理。如果您认为源代码有帮助,可以在mod_cgi.c
中找到它,如果您进行网络搜索的话。
另一个例子是mod_perl
,它是一个Perl解释器模块,可在this link获得。
答案 1 :(得分:0)
一个可以选择的选项是fastcgi,它是一个长期运行的服务器程序,不会不断重启每个请求。过去,快速cgi由于C,C ++,FPC等语言中的内存泄漏而有其缺点,因为它们不是垃圾收集的。一个fastcgi程序中的小内存泄漏在数百万次点击到网站之后可能导致服务器关闭,而常规的旧CGI本身就是一个垃圾收集器:程序重新启动,因此每次有人请求页面并且cgi退出时都会清理。在Go lang的情况下,内存泄漏不是一个问题,但是快速的cgi可能会有一些隐藏的gotchyas,例如:如果golang的垃圾收集器本身有任何内存泄漏......(不太可能,但像这样的getchyas可能会弹出 - 也堆碎片....随着时间的推移..)
通常fastcgi和"长期运行"是过早的优化。我每天都会看到有5位访客访问他们个人主页网站的人大喊大叫#嘿嘿,也许我应该使用fastcgi"事实上,他们每天需要500万访客 - 但他们喜欢时髦和酷,所以他们开始考虑快速cgi,然后他们的网站甚至被3人所知。
你需要问问自己:你使用的服务器是否有大量的流量,而且流量很大我不是说每天有100个访问者...每天只有1000个独立访问者不是很多。
目前还不清楚你是想为apache服务器编写Go lang cgi程序,还是为go服务器编写python,或者你是否正在编写一个具有python和perl的cgi功能的go服务器。澄清你实际在做什么。
至于谷歌作为搜索引擎的竞争对手,有人在另一个答案中发布了:如果你看看谷歌的历史,他们实际上是通过一些cgi系统用C ++ / C编写程序......而不是使用PHP,perl,或其他孩子使用的时髦和酷的东西。在很久以前查找backrub项目及其模板系统。它被称为Ctemplate(C编译程序称为html模板.....)
https://www.google.com/search?safe=off&q=google+backrub+template+ctemplate
Fastcgi可能是谷歌在有一个fastcgi之前想出来的东西,或者他们有自己的专有解决方案类似于fastcgi,我不知道因为我没有在google上工作 - 但是因为他们使用了过去C ++ / C程序为谷歌提供动力(现在可能仍然是某些东西)他们必须使用一些cgi技术,即使它是为了速度而修改了cgi技术。