簡體   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