java與php做web開發(fā) 最大的區(qū)別在那 為什么好多用java的
認(rèn)證高級PHP講師
感覺用PHP做web開發(fā)的后臺的更多,segmentfault應(yīng)該就是php的后臺,Java做web后臺性能更好些,每秒支持的request多些,但java開發(fā)周期長,迭代慢,但對于中小的website,性能從來不是關(guān)鍵,PV在沒達(dá)到幾千萬、上億的情況下,如何靠一個小的團(tuán)隊(duì)迅速迭代產(chǎn)品才最關(guān)鍵。而且做web后臺,性能瓶頸往往在DB。Twitter之前是Ruby開發(fā)的,后來因?yàn)槊刻鞌?shù)據(jù)太大了,才改成Java了(其實(shí)應(yīng)該是Java+Scala+Clojure)。 對于大部分互聯(lián)網(wǎng)公司來說,能否快速的迭代產(chǎn)品才是企業(yè)生存的核心之道, 而且大多數(shù)是混合各種語言的后臺,沒有說單純的是PHP或是Java.
從技術(shù)上來講,LAMP(Linux+Apache+MySql+PHP)基本上是互聯(lián)網(wǎng)的標(biāo)配,基于PHP的framwork明顯更多些。
用PHP的公司: N多中小站點(diǎn),大點(diǎn)的如Baidu, QQ, facebook,當(dāng)然,這些公司也用Java
用Java的: ebay, 阿里, Twitter
PHP做的Web應(yīng)用性能就比Java差嗎? 就拿查詢MySQL獲取結(jié)果集并在頁面上顯示數(shù)據(jù)為例來分析. HTTP請求由C級別的程序比如Apache/Nginx處理(Java的HTTP服務(wù)用的是Java開發(fā)的Tomcat等), PHP則調(diào)用內(nèi)置在PHP引擎的C開發(fā)的數(shù)據(jù)庫驅(qū)動mysqlnd(Java用的是Java開發(fā)的JDBC驅(qū)動)來操作MySQL, 查詢的邏輯這個重點(diǎn)都落在了C/C++開發(fā)的MySQL身上, 然后就是把返回結(jié)果集放到PHP數(shù)組, 經(jīng)過字符串處理后在頁面輸出, 這些邏輯并不復(fù)雜, PHP負(fù)荷并不大. 值得注意的是, PHP內(nèi)置的大量庫函數(shù)全部使用C實(shí)現(xiàn), 而Java的核心運(yùn)行時類庫rt.jar則是使用Java實(shí)現(xiàn).
在一些CLI下的壓力測試中,因?yàn)榇嬖诖罅康难h(huán),很容易就觸發(fā)Java的JIT熱點(diǎn)編譯,這時Java的計(jì)算性能上升到C的級別,這樣的測試結(jié)果只能說Java在計(jì)算上的性能碾壓動態(tài)解釋型弱類型的PHP,而不是在Web上.對比具有JIT的機(jī)制的HHVM和PHP7的性能也能說明這個問題,在bench.php這個計(jì)算腳本的壓力測試中,HHVM還是要比PHP7快1到2倍,但在WordPress等真實(shí)Web應(yīng)用的測試中,HHVM和PHP7兩者的性能相近.
PHP的運(yùn)行模式要比Java健壯穩(wěn)定得多,比如PHP-FPM是經(jīng)典的多進(jìn)程prefork模式,主進(jìn)程會維持指定數(shù)量的工作進(jìn)程數(shù),可以設(shè)置工作進(jìn)程在處理多少個請求后自動重啟.反觀Java多線程的Tomcat,除了內(nèi)存膨脹,代碼稍有不慎,就有可能讓Tomcat崩潰退出,拋出一大堆的錯誤信息.
PHP開啟ZendOpcache后,可以把腳本生成的opcode緩存到內(nèi)存形成opcache供下次請求直接在ZendVM上執(zhí)行,能帶來一定的性能提升.
PHP進(jìn)程(PHP-FPM,Apache)可以和MySQL/Memcached/Redis建立持久連接,一個PHP進(jìn)程保持一個MySQL持久連接,省去每次請求都建立連接的開銷.但需要注意PHP進(jìn)程數(shù)不要超過MySQL最大連接數(shù)這一點(diǎn),超時或重啟MySQL后PHP-FPM在代碼mysqli_connect時會自動重連,但會返回"MySQL server has gone away"的Warning信息,可以用@抑制錯誤輸出.
PHP的熱部署特性大大方便了開發(fā)和運(yùn)維,這點(diǎn)是Java等其他語言(包括RoR/Python/Node.JS)所不能媲美的.
我是PHPer,也自學(xué)過一下JAVA WEB,覺得JAVA很復(fù)雜,而PHP實(shí)現(xiàn)起來卻很簡單。我不評價JAVA和PHP誰好,兩種都是很好的語言,但PHP在WEB上的確有不少優(yōu)勢。
PHP不需要編譯,易于調(diào)試
這是動態(tài)語言非常巨大的優(yōu)點(diǎn),WEB項(xiàng)目的改動實(shí)在太多,編譯會浪費(fèi)很多時間,這使得JAVA難以快速迭代。而現(xiàn)在互聯(lián)網(wǎng)的發(fā)展又非常快,快速迭代的需求是必須的。
PHP有豐富又成熟的框架
YII, CAKEPHP, Zend Framework, ThinkPHP, CI等都是易于使用又久經(jīng)磨練的框架。JAVA的WEB框架很成熟,但真正易于使用的很少。這給不少WEB初學(xué)者不少門檻,讓JAVA程序員的精力更集中于所謂的后臺開發(fā),但現(xiàn)在WEB開發(fā)人員更偏向全能型,PHPer也由于PHP很簡單,他們往往有精力去學(xué)習(xí)并深化CSS、 JS甚至是LINUX的技術(shù)。所以資深點(diǎn)的PHPer可能除了不會做畫,什么都能做。
PHP現(xiàn)成開源產(chǎn)品多
PHP只專注于WEB領(lǐng)域,PHP的產(chǎn)品就是WEB的產(chǎn)品。而PHP又易于使用,所以促進(jìn)它更易于交流。像主流的BLOG系統(tǒng)workpress,很多做個性BLOG的博主為了可以擴(kuò)展自己的BLOG也會學(xué)一點(diǎn)PHP。我是基于drupal做開發(fā)的,對PHP的開源社會情況也有所了解,在大多數(shù)情況下,PHP開源項(xiàng)目已經(jīng)可以滿足絕大部分的要求,輪子都有別人做好了,只是學(xué)會使用這些開源已經(jīng)足夠你在WEB領(lǐng)域上立足。你甚至有更多時間去泡妹子。
PHP非常易于部署
PHP無論在LINUX, MAC還是WINDOWS下都很容易部署,LINUX下甚至可能默認(rèn)有LAMP可以直接使用,這個是其它語言難以超越的。是否易于部署對于初學(xué)者很重要,每個初學(xué)者都希望可以快速實(shí)現(xiàn)自己的Hello World,這會對以后的學(xué)習(xí)過程增加信心。JAVA初學(xué)者總是有比較多的拙敗感。
至于題主說用JAVA的多,的確是這樣,大學(xué)教育也更偏向于JAVA,PHP很少在大學(xué)里開課,所以會JAVA比PHP多并不奇怪。 但在WEB領(lǐng)域上PHP的確是很好的解決方案,企業(yè)用JAVA實(shí)現(xiàn)WEB項(xiàng)目我覺得可能有兩個原因:一是JAVA比PHP更好招人,二是他們已經(jīng)存在一個JAVA成熟的WEB解決方案,就沒有理由去重構(gòu)使用PHP的方案。
我一直做 Java,學(xué) PHP 頭一天,教程里頭教我寫一個訪問計(jì)數(shù)器,結(jié)果竟然要把訪問次數(shù)寫文件里頭。。。這有必要嗎。。。放內(nèi)存不行嗎。。。我就去找,硬是沒找到,敢情這倆思維方式完全不一樣。。。
在做Web開發(fā)的時候,一般都要求要快,快速的上線,快速的迭代。然后慢慢再趨向一個穩(wěn)定狀態(tài)去發(fā)展,說到快,不得不承認(rèn)用PHP來開發(fā)能節(jié)約不少時間,這也是剛開始一些創(chuàng)業(yè)公司或者一些初創(chuàng)項(xiàng)目選擇PHP的很大一部分原因。
你可能要問的是PHP和JAVA在Web開發(fā)上都有哪些優(yōu)缺點(diǎn),下面我回答的卻不是這些,但卻是決定開發(fā)語言很重要的一個因素。
在開發(fā)之前語言的選擇,還常常忽略一個很重要的問題。有時候我們以一個程序員的身份很難考慮到一些客觀因素,這需要有經(jīng)驗(yàn)的技術(shù)管理者來決定。在定一個項(xiàng)目用哪種語言開發(fā)的時候,必須要考慮到團(tuán)隊(duì)成員對這門語言的熟悉程度,還有你所在的城市,以及業(yè)務(wù)自身等等。
假如你的團(tuán)隊(duì)都是一群JAVA大牛,那么你還會要求他們?nèi)ビ肞HP來做開發(fā)嗎?
假如你的團(tuán)隊(duì)成員對JAVA和PHP都很了解,那你要考慮在后期人才補(bǔ)充上面。你所處的城市是怎樣的環(huán)境,要調(diào)查這個人才市場中哪門語言的使用者相對較多。(想象一下在小城市用較新一點(diǎn)的語言做開發(fā)如Go,那招不來人的樣子。)
今年最新的調(diào)查結(jié)果顯示:在北上廣深這些城市,JAVA是職位多人多,而PHP是職位多人少。
等等:-)
總的說,java語言本身規(guī)范性要優(yōu)于PHP, 而且java還有一個“容器”的概念,php則不存在。
但是規(guī)范性優(yōu)就意味著相比PHP要死板,
單單從開發(fā)角度,java 開發(fā)每項(xiàng)功能可能會走 entity->dao->service->action 這一個流程
php 是一種動態(tài)語言,最偷懶的時候 一個Model類和一個Dao類可以兼容所有數(shù)據(jù)表的映射不需要重復(fù)去寫
所以 單說開發(fā)效率上 并不是一個級別的
動態(tài)語言有一些特新在快速開發(fā)上 是java這類編譯語言無法望其項(xiàng)背的
首先,我是動態(tài)語言的支持者,當(dāng)然項(xiàng)目中用什么語言主要還是看老大們熟悉哪個,踩過的坑哪個多,能夠快速解決問題。
區(qū)別
區(qū)別,一個靜態(tài)語言,一個動態(tài)語言,區(qū)別就是動態(tài)語言的生產(chǎn)效率高于靜態(tài)語言,靜態(tài)語言可以在編譯期避免一些低級錯誤。
生產(chǎn)效率高的例子,
動態(tài)語言通過反射等黑魔法,可以快速實(shí)現(xiàn)一些靜態(tài)語言只能靠編譯器級別的底層修改才能實(shí)現(xiàn)的特性(比如AOP、IOC、DI),一個動態(tài)語言開發(fā)者只要了解那個新特性是做什么的就可以快速的實(shí)現(xiàn)它,而不需要進(jìn)行底層修改,所以動態(tài)語言框架特別多,新特性層出不窮,Ruby on Rails就是例子。
靜態(tài)語言編譯期類型檢查,
其實(shí)這個特點(diǎn),對動態(tài)語言并沒有什么吸引,在有了IDE等工具的支援,以及TDD開發(fā)方式的流行后,編譯期類型檢查就很雞肋了。
為什么好多用java的
現(xiàn)實(shí)是PHP比Java用的多,開發(fā)和部署都比Java快很多
用go好了,無論開發(fā)效率還是運(yùn)行效率都要優(yōu)于JAVA,并且和php一樣好學(xué),即便有坑,也不是出外語言本身
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號