做ROR有一年了, 感覺非常好.配合敏捷實踐(除了pair, 由於是和美國工程師遠程合作.)開發速度的確快.一共三個人寫代碼,短短半年, 項目就基本結束了....
現在新項目即將到來, 客戶在php和rails之間難以取捨. 我也打算趁此機會了解一下php.
由於項目定制性還是比較高,想通過成熟的CMS等系統來改改估計是沒戲。
從頭開發又覺得太慢。於是想從開源框架入手。
經過了解才發現, php新興的一些框架基本上清一色的學習(或者叫抄襲,特別是cakePHP, 那簡直抄得太厲害了.)rails。而且這些框架還發展的很好,越來越受到php社區的歡迎。 比如國外cakePHP,國內的Fleaphp, QeePHP等等,就不一一列舉了.
昨天用cakePHP做了個簡單的demo, 確實抄rails那是抄的相當直白。 甚至連rake都還有相應的東西代替。除了migration和filter我沒找到對應的東西。讓我一個不懂php的人,都還是可以很快地上手了.
一方面感歎php抄rails這種徹底,另一方面也感歎這些抄襲之作的確也帶來了php開發效率的提升。雖然由於php本身的原因,框架的引入對性能的影響是比較大的。但是這些框架的出現大有重整php社區的意思。(至少客戶就告訴我們,用rails不如用cakePHP,這樣他們也不會引入更多風險。他們還介紹他們美國幾個團隊都又從rails轉回cakePHP了.)
我就納悶兒了,當時還覺得rails就是沖著php的市場去的。。。現在反而覺得rails的思想拯救了php...
大家覺得是應該繼續說服客戶呢? 還是就用山寨rails了呢?
高手robbin的回復:
----------------------------------------------------------------
PHP和Python/Ruby的運行機制有一個本質區別:PHP是每次HTTP請求過來以後,初始化全部資源(例如創建數據庫鏈接、加載系統類庫,創建緩存等等),處理完畢,釋放全部資源,這不像Python/Ruby之類帶有GC的腳本語言,Python/Ruby是初次啟動的時候初始化資源,隨後的請求就不必再次初始化資源了。
這種機制的差異帶來的區別就是:
1、PHP極難出現嚴重的內存洩露問題,隨便你代碼寫的多爛,反正每個請求一執行完畢,所有資源統統釋放光。而Python/Ruby則需要依賴GC來回收內存,因此稍有不慎,還是會出現GC無法釋放的內存洩露問題。
2、PHP每次請求都要初始化資源,這個開銷非常大。所以盡管PHP解析器本身的運行速度是極快的,但是一旦使用復雜的PHP框架,那麼由於需要每次請求的時候初始化整個框架,性能的下降非常厲害,你用一個很復雜的PHP框架的結果就是整體性能被Ruby遠遠甩開。這也是為什麼PHP社區這麼多年來,並不怎麼傾向於使用框架的原因之一。
3、由於PHP這種每請求初始化資源的機制,也造成了PHP添加跨請求的高級特性相當困難,這是PHP本身一個很大的限制,但是反過來說,正是這種限制使得PHP始終保持在一個比較簡單的web語言上面,而正是這一點才是PHP得以成為互聯網第一Web編程語言的原因,因此也未必就不好。
總之,PHP和Ruby的差異還是很大的,不適合放在一起比較,其實應該比較的是Ruby和Python才對。
所以我覺得Rails這種框架性做法被PHP跟風以後,其實是把PHP帶上了邪路,所以不如說是Rails在誤導PHP的發展。順便多說一句:DHH在編寫basecamp之前,一直是用PHP的,並且自己還寫了一個PHP的快速開發框架,他改用ruby以後,把當初自己寫的PHP框架也移植過來了,這個框架實際上是Rails最初的原型。那麼為什麼DHH當初不直接基於PHP做Rails呢?非要改用ruby以後,才發表rails呢?你看看PHP這種運行機制就知道了,PHP做復雜的web開發框架並不是一條光明的道路。