繁体   English   中英

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

[英]FastCGI C++ vs. A Script Language (PHP/Python/Perl)

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

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

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

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

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

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

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

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

  • python,内联c
  • php:c中的扩展
  • 通过rhino的服务器端javascript:直接访问java / jvm (这是一个很好的例子是orf.at,奥地利最大的网站之一,由helma驱动 - 服务器端jvm解释的javascript!)

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

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

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

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

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

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

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

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

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

随着STL的到来和Boost解析文本的开发在C ++中变得非常容易。 两年前,如果我必须解析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功能的不错选择。

问题是“创造价值的地方在哪里?”

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

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

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

  • 演讲。 只需使用一些{{}} “在这里填写一个值”和一些{% for thing in object_list %}构造中的页面来设计HTML页面,您的页面就可以开始了。 没有字符串操作。

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

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

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

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

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

拥有一个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。

之前有人问过这个问题: 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这样的框架可以简化生活。

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

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

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

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

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

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

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

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

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

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

干杯,

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

我通过Google进行的每次搜索都表明,C / C ++为需要诸如在网页中搜索信息或从数据库获取信息等功能的Web应用程序提供了最佳性能。

对此有一些新的答案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM