FastCGI C ++与脚本语言(PHP / Python / Perl)

时间:2009-04-30 08:43:03

标签: php c++ python perl fastcgi

使用FastCGI C ++与PHP / Python / Perl完成同样的工作有什么起伏。

任何表现或设计陷阱或使用其中一个?甚至欢迎你的意见。 (告诉我为什么一个或另一个岩石,或一个或另一个糟透了)。

16 个答案:

答案 0 :(得分:31)

脚本语言可能比C慢,但这是一个问题吗?几乎从不。如果性能成为问题,您就开始只翻译关键部分。

twitter / ruby​​就是一个很好的例子;红宝石很慢。一些语言功能(首先让ruby很好)只是防止不同类型的优化(jruby家伙有一篇很棒的文章关于这个...是ola bini?不记得了。)

仍然,Twitter由ruby提供支持,因为ruby 足够快。不久前,“博客”报道Twitter出于性能原因迁移到scala ......事实是,只有消息队列(以及后端的其他部分)转移到scala。雅虎运行各种语言; php用于前端,其他更快的语言用于性能至关重要的地方。

那么,为什么表现不那么重要?有几个原因:

  • 数据库瓶颈:脚本不是很慢,数据库是
  • 客户端瓶颈:浏览器中的呈现需要的时间比请求长。优化服务器端,没有人会注意到
  • 横向缩放:通常添加另一台服务器并因此将请求/秒增加三倍而不是优化应用程序
  • 开发人员时间和维护是项目中最昂贵的部分。你会得到更便宜的python开发者来维护你的应用程序,而不是基于网络的c-coders在更短的时间内
  • 无编译,短开发周期

另一个专业脚本点:许多脚本语言支持内联或包含快速(C)代码:

  • python,inline c
  • php:c
  • 中的扩展程序
  • 服务器端javascript通过rhino:直接访问java / jvm (这方面的一个很好的例子是orf.at,奥地利最大的网站之一,由helma提供支持 - serverside jvm-interpret JavaScript的!)

我认为,特别是在网络开发中,高级脚本的优点远远超过了缺点。

答案 1 :(得分:22)

几年前,我或多或少地在工作中学习了网络应用程序编程。 C是我所熟悉的主要语言,所以我用C.写错了(相当大规模的)Web应用程序。 C的字符串处理和内存管理很繁琐,而且由于我缺乏Web应用程序的经验,它很快就变成了一个难以维护的项目。

C ++会明显更好,主要是因为std::stringchar*好得多。

但是,现在我每次都使用Python(虽然PHP不是一个糟糕的选择,也许更容易上手)。 Python的字符串处理非常棒,它可以无缝地处理Unicode。 Python比C ++有更好的Web工具和框架,它的正则表达式处理和标准库(urllib,电子邮件等)工作得很好。而且您不必担心内存管理。

如果我受到严格的RAM约束(比如在嵌入式微型计算机上),或者如果我在Google工作并编写了一个必须响应的搜索引擎,我可能只会将C或C ++用于Web应用程序每秒数千个查询。

答案 2 :(得分:11)

使用C ++可能会导致应用程序比PHP,Perl或Python快得多,并且比C#或Java快一些 - 除非它花费大部分时间等待数据库,在这种情况下不会有差别。这实际上是最常见的情况。

另一方面,由于benhoyt提到的原因,用C ++开发一个Web应用程序需要更长的时间并且难以维护。此外,它更可能包含严重的安全漏洞(现在每个人都最担心SQL注入和XSS - 但如果他们用C ++编写他们的webapps,那将是缓冲区溢出,这将是他们的整个网络变得pvwned而不仅仅是数据)。

这就是为什么现在几乎没有人用C ++编写Web应用程序。

答案 3 :(得分:8)

我认为有人应该成为Webapp / C ++主题的先驱,进行测试并提供概念验证解决方案。

随着STL的到来,使用C ++开发Boost解析文本变得非常容易。两年前,如果我必须解析CSV数据,我会使用Python或PHP。现在我使用C ++和STL / Boost。将CSV文件读入矢量?没问题,简单的getline + boost :: split + lexical_cast。计算对矢量中的数据总和?没问题:

pair<int, double> sum_int_double(pair<int,double> & total, pair<struct in_addr, pair<int,double> > & a) {
    total.first += a.second.first;
    total.second += a.second.second;
    return total;
}
pair<int,double> mixedSum = accumulate(mixedVec.begin(), mixedVec.end(), emptyPair, sum_int_double);

将数据从地图传输到成对的矢量?没问题:

mixedVec.assign(amap.begin(), amap.end());

一切都很清晰明确。字符串操作,正则表达式,算法,OOP等等。在C ++中,一切都已经很好地定义和成熟。如果您的应用程序将是真正的应用程序,而不是基于文本的解析,那么C ++也是其OOP功能的不错选择。

答案 4 :(得分:7)

问题是“创造价值的位置在哪里?”

如果您认为该值是在内存管理中创建的,请仔细进行类设计并使每晚构建工作,然后使用C ++。您将花费大量时间编写大量代码来执行重要操作,例如删除不再引用的对象。

如果您认为该值是在部署人们可以使用的应用程序,那么将Python与Django框架一起使用。 Django教程告诉您,在大约20分钟内,您可以启动并运行应用程序。它是生产就绪的,你可以专注于重要的事情:

  • 模特。只需在Python中编写模型,ORM层就可以为您处理所有数据库交互。没有SQL。没有手动映射。

  • 演示文稿。只需使用一些{{}}“填写一个值”和一些{% for thing in object_list %}构造来设计HTML页面,您的页面即可开始使用。没有字符串操作。

  • 视图功能。编写简单的Python函数来封装站点的处理部分。不是验证(那些是在表单中),不是表示(在模板中),而不是底层模型(在模型类中),而是一些授权检查,查询处理和响应公式。由于Python有一组丰富的集合类,因此这段代码非常简短。

  • 其他的东西。 URL映射是Python正则表达式。表格与您的模型相匹配;您可以将默认值子类化以添加自定义输入验证和处理。

  • 精彩的单元测试框架,用于低级模型功能以及端到端操作。

没有内存管理,没有抽象和接口的严谨的类设计。不用担心如何优化字符串操作。没有夜间建造。只需创造真正有价值的东西。

答案 5 :(得分:6)

如果您希望能够在现有的运行进程(例如守护进程)中实现Web服务,该进程是用C / C ++编写的。使该进程实现该接口的FastCGI协议是有意义的。让Apache处理HTTP(双向SSL等)到外部世界,并通过套接字通过FastCGI进行现场请求。如果您在PHP中执行此操作,则必须让PHP与您的流程进行通信,这意味着维护PHP代码以及您的流程。

答案 6 :(得分:4)

拥有FastCGI Web应用程序(无论是C ++,PHP,Perl,Python,Ruby等),您可以获得比CGI应用程序更好的初始启动时间。 初始启动时间我指的是Web服务器收到请求的时间与您编写的第一个代码行运行的时间之间经过的时间,因此初始启动时间是访问者的最短时间您的Web应用程序必须等待每个请求。初始启动时间为1秒并不罕见,特别是如果您的应用程序很大或者您使用的是大型框架(例如Ruby on Rails)。 FastCGI在响应第一个请求后使应用程序保持运行,因此FastCGI减少了所有后续请求的初始启动时间(第一个请求除外),通常缩短到几毫秒。

如果您使用PHP,通常其默认配置提供足够好的初始响应时间(即使没有FastCGI),但请确保在生产服务器上使用PHP加速器(请参阅http://en.wikipedia.org/wiki/PHP_accelerator)以获得更好的性能

大多数编程语言和框架允许您通过更改应用程序的配置而不更改代码,以不同的服务器模式(例如CGI,FastCGI,内置Web服务器,Apache模块)运行相同的应用程序。在编写应用程序时,FastCGI通常不是最佳选择,因为在更改代码之后,您可能必须重新启动应用程序才能获取更改,但重新启动FastCGI应用程序通常很麻烦。重新启动CGI或内置Web服务器要容易得多。您应该仅在生产配置中设置FastCGI。

答案 7 :(得分:3)

以前有人问过这个问题:http://cppcms.sourceforge.net/wikipp/en/page/main

CppCMS项目提供了使用C ++进行Web开发的框架。

您可以查看以下基准来了解有什么区别:http://cppcms.sourceforge.net/wikipp/en/page/benchmarks - 大约两个数量级。

PHP / Python的问题是它们很慢,缓存中存在很多问题 PHP的FastCGI过程中的数据。

C ++最大的问题是C ++中的Web开发资源很少。但是,采用像CppCMS这样的框架可以简化生活。

答案 8 :(得分:3)

这里有一个中间地带。 Python(我相信Perl和Ruby)允许你从100中调用99次函数,你不需要。但是如果你需要的话,很高兴知道该选项就在那里。

通常对于webapps,编程语言的速度根本不是问题。在执行单个数据库查询所花费的时间内,处理器可以执行几十亿条指令。发送和接收http数据大致相同。

答案 9 :(得分:2)

您可以将FastCGI与PHP / Python / Ruby / Perl一起使用,以获得足够的运行时性能,直到您的网站变得非常大。即使这样,您也可以在不放弃脚本语言的情况下进行体系结构改进(数据库调优,缓存等)以进行更多扩展。一些非常大的站点是用PHP / Python / Ruby / Perl完成的。

使用高级语言获得的巨大收益是程序员性能。这就是你应该首先担心的事情。对用户的功能需求做出快速响应比对页面响应时间缩短几毫秒更为重要。

答案 10 :(得分:2)

嗯......使用C / C ++和Python / Perl / Ruby / Java / .NET可以节省内存和CPU的功耗。如果使用C / C ++节省的资源占可用总资源的很大一部分(在机器人的嵌入式板上运行的FastCGI),那么,是的,C / C ++。否则,为什么要这么麻烦?

答案 11 :(得分:2)

可能有人会对Wt [1]感兴趣,这是一个完全用C ++编写的Web工具包。它可能是cppCMS的替代品。我在这些圣诞假期都在尝试..

[1] http://www.webtoolkit.eu/wt

答案 12 :(得分:1)

太糟糕了,没有C / C ++与Perl CGI的基准 没有FastCGI,我认为C / C ++会快得多,FastCGI可能会更快(但可能会少一点 - 所有初始化部分都执行一次)。
同样,这非常依赖于应用程序,因此应该为不同的动态网页提供某种基准。

我个人认为,如果你的公司有资源,它应该/可以投资C / C ++(考虑到他们必须找到合适的......),否则最好坚持使用脚本语言。
当然,如果要部署 fast 应用程序,则应使用C / C ++。

在一天结束时,编译语言更快。但是现在很难找到好的C / C ++开发者吗?

干杯,

答案 13 :(得分:1)

C ++是一种强类型语言...即。你可以声明整数,浮点数等....通常你可以使用弱类型语言更有效地编程。 Facebook报告称,从PHP切换到C ++时,性能提高了50%。我认为脚本语言是原型语言......当你想要生产水平效率时,使用编译语言。

答案 14 :(得分:0)

我在Google上的每次搜索都表明,C / C ++为需要功能的网络应用提供了最佳性能,例如在网页中搜索信息或从数据库中获取信息。

答案 15 :(得分:0)

对此有一些新的答案。

  1. 如果您需要已编译的应用程序,您可能会发现Google's Go language是一种具有现代功能的优秀编译语言。
  2. 使用脚本语言(我使用Perl)编写应用程序可以通过MojoliciousDancer之类的框架完成,然后使用PSGI/Plack控制器,它可以在CGI上运行, FastCGI,mod_perl,本地服务器(如Mojolicious的Hypnotoad)或云部署,都没有修改。其他脚本语言也存在类似的概念。
相关问题