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

The*_*own 22 php c++ python perl fastcgi

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

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

ste*_*efs 31

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

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

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

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

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

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

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

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

  • +1:我们的所有Python/Django站点在0.02秒内响应.我们的VPN,SSL,网关和浏览器将其转换为2秒.语言不是瓶颈,它是技术堆栈中的其他所有东西. (11认同)

Ben*_*oyt 22

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

C++会明显更好,主要是因为std::string它比char*.

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

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

  • 说真的,C for web app是不好的选择,它不应该用作问题的一个例子.C++是IMO完全不同的故事.对我来说,编写例如在C++中解析"脚本"的CSV数据比在Python中编写要容易得多.有了Boost和STL,它也很有趣.Web应用程序(取决于设计)通常是这样的"解析脚本",因此C++可以很好地执行IMO. (6认同)
  • 你确定吗?使用Python的标准库,只需"导入csv",您就可以在一行代码中解析CSV文件,"对于csv.reader(f)中的行:do_stuff_with(row)".另外:你是对的,也许提到C是不公平的. (5认同)

Mic*_*rdt 11

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

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

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


小智 8

我认为有人应该成为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);
Run Code Online (Sandbox Code Playgroud)

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

mixedVec.assign(amap.begin(), amap.end());
Run Code Online (Sandbox Code Playgroud)

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


S.L*_*ott 7

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

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

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

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

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

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

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

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

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

  • @JasonBaker因为这篇文章中几乎所有内容都是错误的.C++不需要手动内存管理; 使用RAII和框架可以显着减轻内存负担,可以生成简单的模板和"视图"(通过访问者模式),与Python一样易用,并且使用精彩的RE2库,执行速度更快.Django并不比[wt](http://www.webtoolkit.eu/wt)更容易编写需要扩展的应用程序. (2认同)

rst*_*ley 6

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