PHP 和 Java 的主要區別有哪些?

PHP 和 Java 的主要區別有哪些?

其實Java方面我要學的真的還有不少,要是有大項目的機會和經驗就好,因此提早我確定要把基礎打紮實。
我要學的還有不少,好比前段,後端,還有linux,還有確定要寫出完整的操做系統,並且Java方面要更加熟練。
我須要把HTML5的那個進階給學了。
PHP資源不少,那麼這就好玩了。
 

PHP暫時還不支持像Java那樣 JIT運行時編譯熱點代碼,可是PHP具備opcache機制,可以把腳本對應的opcode緩存在內存,PHP7中還支持配置opcache.file_cache導出opcode到文件.第三方的Facebook HHVM也支持JIT.另外PHP官方基於LLVM圍繞opcache機制構建的Zend JIT分支也正在開發測試中.在php-src/Zend/bench.php測試顯示,PHP JIT分支速度是PHP 5.4的10倍.
https://github.com/zendtech/php-src/tree/zend-jit/ext/opcache/jit
https://www.phpclasses.org/blog/post/493-php-performance-evolution.html

 


PHP的庫函數用C實現,而 Java核心運行時類庫(jdk/jre/lib/rt.jar,大於60MB)用Java編寫(jdk/src.zip), 因此Java應用運行的時候,用戶編寫的代碼以及引用的類庫和框架都要在JVM上解釋執行. Java的HotSpot機制,直到有方法被執行10000次(-XX:CompileThreshold=10000)纔會觸發JIT編譯, 在此以前運行在解釋模式下,以免出現JIT編譯花費的時間比方法解釋執行消耗的時間還要多的狀況.

 

PHP內置模板引擎,自身就是模板語言.而Java Web須要使用JSP容器如Tomcat或第三方模板引擎.php

PHP內置HTTP服務器和SQLite數據庫,以及 Apache模塊實現libphp.so和FastCGI服務PHP-FPM.而Java Web開發時廣泛須要使用第三方的Servlet容器Tomcat等.
PHP內置的單進程HTTP服務器(可用於快速開發和測試):
php -S 127.0.0.1:8080 -t /www

PHP-FPM跟Nginx同樣,是多進程的架構,worker進程處理請求,master進程不處理請求,只負責維護worker進程,好比定量重啓,崩潰重啓等.PHP-FPM支持進程池的特性,不一樣進程池相互隔離,互不影響.好比你能夠配置一個監聽9000端口的進程池www和一個監聽9001的進程池io來分離IO密集腳本:
nginx.conf: 訪問io.php的請求都交給監聽9001的PHP-FPM進程池處理
location = /io.php {
	include fastcgi_params;
	fastcgi_pass 127.0.0.1:9001;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
php-fpm: 正常腳本由靜態www池處理,阻塞腳本由動態io池處理
[www]
;名爲www的進程池監聽9000端口,常駐進程數量爲固定4個
listen = 127.0.0.1:9000
pm = static
pm.max_children = 4
[io]
;名爲io的進程池監聽9001端口,進程數常駐4個,最大8個
listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 4
其中I/O密集這個進程池[io]採用動態的prefork進程,好比這裏是繁忙時8個,空閒時4個.
利用PHP-FPM提供的池的隔離性,分離計算密集和I/O密集操做,能夠減小阻塞對整個PHP應用的影響.

也就是說,PHP經過多進程利用多核實現併發,而Java廣泛經過多線程實現併發,由於一個JVM實例就是一個進程.html

另外,PHP也能夠運行在多線程模式下,好比Apache的event MPM和Facebook的HHVM都是多線程架構.無論是多進程仍是多線程的PHP Web運行模式,都不須要PHP開發者關心和控制,也就是說PHP開發者不須要寫代碼參與進程和線程的管理,這些都由PHP-FPM/HHVM/Apache實現.前端

PHP-FPM進程管理和併發實現並不須要PHP開發者關心,而Java多線程編程須要Java開發者編碼參與.PHP一個worker進程崩潰,master進程會自動新建一個新的worker進程,並不會致使PHP服務崩潰.而Java多線程編程稍有不慎(好比沒有捕獲異常)就會致使JVM崩潰退出.java

對於PHP-FPM和Apache MOD_PHP來講,服務進程常駐內存,但一次請求釋放一次資源,這種內存釋放很是完全. PHP基於引用計數的GC甚至都還沒發揮做用程序就已經結束了. 並且,在PHP腳本中用unset顯式釋放內存也是立竿見影的,不會有延時.而Java的內存回收嚴重依賴GC機制,高併發下的Full GC會致使Java服務雪崩:JVM忙於用GC回收內存沒法處理請求,而新請求又源源不斷地到來.node

PHP的運行模式決定了PHP自然支持熱部署,而Java要實現熱部署並不容易.這也是爲何在虛擬主機託管環境裏PHP佔絕對優點的緣由,由於開發者經過FTP上傳PHP文件到虛擬空間就實現了代碼更新和部署.python

PHP跨進程共享數據,除了使用基於文件的session機制和鳥哥開發的無鎖共享內存緩存擴展Yac.Linux上還可使用內存文件系統(tmpfs)上的SQLite(如/dev/shm/data.sqlite3).而Java程序的生命週期隨JVM常駐內存,線程能夠訪問共享數據.mysql

PHP不存在數據庫訪問速度比Java慢的問題.PHP的數據庫驅動如mysqlnd等都是C實現的驅動,而Java的數據庫驅動JDBC是Java實現的驅動,PHP的驅動性能並不吃虧.並且PHP一樣支持數據庫持久鏈接,也就是多個請求能複用一個數據庫鏈接,並不須要每一個請求都打開一個數據庫鏈接.好比下圖就是兩個PHP-FPM工做進程跟MySQL保持的兩個長鏈接:react


PHP跟Java都誕生於1995年,沒有PHP相對Java是後起之秀的說法,反卻是 PHP一開始就是用於Web開發,而Java不是.Java的前身Oak語言,是爲了 嵌入式軟件開發而設計.

 

C實現的PHP後來吸取了C++的對象編程思想,加入了對象編程支持.既能夠用過程式,也能夠用對象,更靈活.而Java必須徹底面向對象編程,甚至還要把類名和文件名掛鉤.linux

PHP能不能開發大型應用,取決於使用者是否因地制宜地使用PHP. 好比,PHP就不適合用來開發數據庫引擎(大多都是C/C++實現)等計算密集型應用.Java在計算密集型應用上相比PHP更有優點,好比HBase數據庫使用了Java實現.不過大多數Web應用都是I/O密集型應用,這裏麪包括網絡I/O,文件系統I/O,數據庫I/O.android

PHP是C實現的Web快速開發框架,不依賴第三方框架也能實現快速開發.而Java Web開發廣泛依賴Spring等第三方框架.

補充:
回覆

 

數據庫持久鏈接很容易用,mysqli裏host參數傳遞p:127.0.0.1就能開啓持久鏈接,pdo_mysql裏把PDO::ATTR_PERSISTENT設爲true也能夠開啓持久鏈接.並且PHP的數據庫持久鏈接也不依賴PHP-FPM,個人截圖不過是舉例說明,其實用Apache也同樣能夠.只是PHP-FPM的進程數或者Apache進程/線程數最好配置爲固定數量,並且要求數量不能超過MySQL最大鏈接數(max_connections默認是151).

進程間共享數據,除了Yac,我不是還說了Linux內存文件系統tmpfs上的SQLite麼?SQLite的鎖機制夠用了呀,連事務都支持,你擔憂什麼?並且內存上也不須要擔憂SQLite的讀寫性能限制,徹底是SQLite引擎在內存上的計算密集操做.能利用Linux的tmpfs機制,能利用SQLite的鎖機制,而不依賴PHP實現,我以爲頗有優點很穩定.

這裏討論的不是Swoole這類CLI下實現的PHP服務,而是PHP傳統的FastCGI模式.長時間後臺常駐運行的PHP腳本,固然須要GC.對於一些要求實時的高併發應用,我以爲就不該該使用GC機制.PHP能夠配置zend.enable_gc=off來禁用GC,而且本身經過unset來手動釋放內存.不過運行在FastCGI下的PHP腳本生命週期很短,其實原本就不依賴GC.再次強調,高併發實時類應用,GC毫不是一個優點,而是一個劣勢.

PHP常見的SAPI有這麼幾種:
php(cli,cli-server)
php-cgi(cgi-fcgi)
php-fpm/hhvm(fpm-fcgi)
libphp7.so/php7apache2_4.dll(apache2handler)
fpm-fcgi和apache2handler下,不管是多進程模式仍是多線程模式,進程和線程的實現和管理都不須要PHP開發者關心(這是優點),而是由php-fpm/hhvm/apache實現.PHP開發者若是要參與多進程或多線程編程,徹底能夠在php-cli下實現,相關PECL擴展包括pcntl多進程,pthreads多線程,libevent事件驅動等等,相關的項目實現有WorkerMan.另外峯哥的Swoole也須要用php-cli跑,但其服務的進程和線程控制也是由Swoole實現而不太須要PHP開發者關心.

PHP從5.4內置的單進程HTTP服務器,目的就是用於快速的開發和測試,我以爲是一個很方便的工具,開發者不須要安裝和配置Apache或者Nginx之類Web服務器就能進行入門開發.並且把PHP解釋器交叉編譯到Android手機或者OpenWRT無線路由就能用PHP這個省資源的HTTP服務器在局域網內編程並提供服務,很方便.

JIT在大量計算上有優點,bench.php腳本就是用來測試計算性能.真實應用如WordPress等,JIT能帶來的性能提高確定不會這麼明顯,具備JIT機制的HHVM和沒有JIT的PHP7,在壓力測試WordPress時體現出同一水平,就說明了這個問題.並且我強調過,Web應用大可能是I/O密集型應用,編譯型語言不會在I/O密集型應用裏也具備數量級的優點.因此說,對於大多數PHP開發者來講,就算是沒有JIT機制的PHP7,性能也夠用了.

回覆
mem php-fpm && siege -c10 -t1M http://www.example.com/app/punbb/index.php > /dev/null && mem php-fpm
其中mem是我定義在~/.bashrc裏的一個用於快速根據名稱查看程序狀況的函數:
mem () 
{ 
    top -n1 -b | head -n7 | sed '1,6d' && top -n1 -b | sed '1,7d' | grep --color=auto -i $1;
    ps aux | grep --color=auto -i $1 | grep --color=auto -v grep | awk -F " " '{ sum += $6 } END { printf "Total Memory Usage: %.1f MB\n", sum/1024 }'
}
測試程序PunBB是一個MySQL驅動的PHP輕量級論壇.
用siege併發10,壓測1分鐘,PHP-FPM工做進程的內存(RES)都是13.4MB,並不存在你所謂的PHP-FPM內存佔用會不斷隨請求數量而增加的問題,有圖有真相:
 
 

 

 
 php和nodejs通常被用於作 大前端的開發,而 java,go通常用於 大後端的開發。二者方向不同。咱們公司大後端用的 Scala,java的衍生產品。從難度上講,大後端的東西確定比大前端的複雜一點。
 
 


一、語言難易比較

  PHP是一種解釋執行的腳本語言,語法和C語言相似,易學易用,不懂電腦的非專業人員稍經學習也能使用PHP.而Java要先編譯成Class文件,而後在Java虛擬機上執行,Java開發須要熟悉Java語法以及一些核心的架構,從而實現一種可複用的、跨平臺的軟件,Java培訓比PHP培訓要難學的多

二、技術架構比較

  從技術架構來講,Java語言相比PHP有明顯的優點,Java使用的是面向對象的系統設計方法,而PHP仍是採用面向過程的開發方法。PHP只能實現簡單的分佈式兩層或三層的架構,而JAVA能夠實現多層架構。數據庫層、應用邏輯層、表示邏輯層彼此分開,並且如今不一樣的層都已經有一些成熟的開發框架的支持。例如Struts就是利用Java的web開發技術實現了MVC的設計模式,而在業務邏輯層也有Spring框架,數據庫持久化層有Hibernate等框架。這些框架能夠方便開發者高效、合理、科學得架構多層的商業應用。從數學運算和數據庫訪問速度來說,Java的性能也優於PHP.實際上,對於跨平臺的大型的企業應用系統來說,Java幾乎已經成爲惟一的選擇

三、Java和PHP技術層面對比

  Java是純面向對象開發,功能強大,分支衆多,沒有Java不能作的軟件。C/S也好B/S也好。從功能上講,沒有語言能夠和Java相比

  PHP屬於後起之秀,吸取了Java和c以及perl等語言優勢,專一互聯網領域。WEB領域PHP擁有得天獨厚的優點,WEB領域沒有語言能夠和他比

四、Java和PHP的發展空間對比

  安卓勢頭很猛,但手機安裝app數量有限,推廣難,也是app面臨的最大挑戰,好在安卓只有JAVA能夠作,除此以外就是HTML5了。目前來講互聯網的發展空間巨大,而互聯網離不開WEB,WEB離不開PHP。二者相比,我的以爲PHP的優點更加明顯。

五、適用性比較

  PHP適合於快速開發,中小型應用系統,開發成本低,可以對變更的需求做出快速的反應。而Java適合於開發大型的應用系統,應用的前景比較廣闊,系統易維護、可複用性較好。還有,一樣功能的系統用Java開發的系統要比PHP開發的系統的價格要高

六、薪資比較

  薪資事由供求關係決定的,人才缺失,薪資天然高,人才飽和,薪資天然不會高。從需求上看企業對Java人才的需求是比較大的,但Java方面的人太多,而PHP方面的人才要少不少,因此面上看PHP的薪資應該要高一些,但Java只要學得好,薪資高的也不少,這方面仍是看技術。

  總結下:無論是PHP仍是Java都是不錯的選擇,目前來講這兩種語言都還處在勢頭上,可是從長遠出發仍是Java好,畢竟從性能、處理數據各方面來看仍是Java有優點一些,固然最終選擇仍是在你本身的手裏。

 
 


簡單說幾點
1:java是半編譯語言,php是腳本語言
2:java使用封裝繼承,最小的單位是,php做爲腳本,最小單位就是語句用二者輸出hello world就知道了,因此java語法比較嚴格,而php很靈活
3:java是自動內存分配回收,php是一次建立一次銷燬,相同點:二者都不用考慮內存泄漏問題,不一樣點:java能夠常駐內存,多線程;php沒法常駐內存,也沒有線程的概念
4:java分三個方向
J2ME,嵌入式設備,安卓就是目前最大的J2ME平臺,不過其使用的不是JVM,而是谷歌本身開發的虛擬機
J2SE,桌面編程,基本沒落,須要JVM支持
J2EE,web方向的編程,近些年大規模的衰減,java語言排名榜之因此跌這麼快,就是因爲J2EE的出走,若是不是安卓興起,java的現狀可能更悲慘點,近年來腳本語言發展太快,擠壓了java在web上面的開發。不過在企業級的解決方案裏面,由於追求性能和安全行,基本上仍是java老大
PHP:不用想了,就是爲web而生的語言,出了web什麼都作不了,這既是它的缺點,也是它的優勢,語法簡潔靈活,和java冗長的語法正好造成對比

5:java已是一門很成熟的語言,或者說其語言的進一步提高已經不可能能了,曾經看到一篇文章,講編程語言的進化,其中提到,java語言的進化樹太全了,使得其沒有發展的空間
php是在web繁榮以後興起的語言,因此語言成熟度沒有java高,2006年(若是我沒記錯的話)推出的php5.0才略微完善了面向對象的機制

記憶寫成,若有錯誤,歡迎指出
 
對答案中有些關於 Java 的觀點略有不一樣:
1. 若是說 Java 的『最小單位』是類,那麼 php 的『最小單位』應該是文件。
2. Android 並不屬於也不是 Java ME(答案中好像誤寫成了 J2SE) 平臺。
3. Java SE 並非桌面編程,而是 Java 標準版本,而且也沒有沒落,由於它是 Java EE 和 Android 開發的基礎。
4. Java EE 並不僅是 Web 方向,而是一套適用於企業級應用的標準和相關實現。
 
你說的第一點不怎麼贊同,java由於IDE裏面直接集成了對文件的編譯,而php必需要用瀏覽器訪問,是否所以認爲php最小單位是文件呢?其實php能夠直接像python同樣命令行交互,不過由於php自己設計的問題,使得其很不流行
第二點贊成,我在裏面說了android使用的是其自身的虛擬機,只是借用了java的語法
第三點我贊成:我在文中只是說J2SE的主要應用,任何學校教java都是從J2SE開始的
第四點贊成,我在文中說了其在企業級的解決方案仍是老大
 
 
語言的差異仍是比較大的, 想對於 語言, 差異大了去的更多在 JVM 和 Zend Engine or HHVM , 做爲同時使用 PHP 和 Java 的我,主觀的來講句吧。 趕忙去學下Java 學下PHP, 而後都到了中等水平後(這個很難把握), 你就知道Java 的強大在哪裏(不少來自於他繼承了C++的依鉢,幹了不少之前C++乾的事兒,並且現在在Web領域大發光彩,但他的最強大的地方可能仍是,成熟、穩定、如今性能極高); php麼,做爲Web領域而言,確實很是好用, 可是但願你們好好去看看爲何 要有 HHVM ,你就知道了, PHP會前進的方向, 如今 PHP7 的方向
 
Java有GC並不意味着不存在內存泄露.PHP請求完成後釋放內存並不依賴PHP的GC.

另外PHP服務進程如帶PHP模塊的Apache進程或者PHP-FPM進程都是常駐後臺,只不過額外支持動態伸縮的配置,也就是繁忙時fork出更多的進程服務,空閒時關閉一些進程來騰出內存,固然,你配置了不增不減固定個數的常駐進程也徹底能夠,好比PHP-FPM:
pm = static
pm.max_children = 8
那PHP-FPM就是後臺固定常駐8個工做進程.

另外PHP腳本對應的中間碼opcode能夠經過opcache機制緩存在內存.還有PHP經過Linux內存文件系統上的SQLite如/dev/shm/data.sqlite3也能夠實現跨進程共享數據.
 
 

鄙人工做須要,兩種語言不斷切換,就簡單談一談二者區別

首先 php確實是開發速度極快,爲何?由於 弱類型(php7有類型聲明選擇開關,只要引入開關指令declare(strict_type=1)就會強制當前的文件下的程序遵循嚴格的參數類型,返回值類型),不須要定義返回的類型,加上php實際開發過程當中喜歡運用它萬能的數組來作計算,返回。因此他的 動態擴展性很是強,若是返回值結構改變,不要緊,直接改 數組結構就行(注意, php數組太強大,能夠看成map,list來用,底層的實現實際上是hashmap)
而java可能要開發過程可能要慢一點,java面向對象的技巧,設計模式會運用的更多一點。須要定義各種model來適應你業務的需求。編寫風格會有必定的統一要求。 強類型在編寫的時候會比php麻煩,但好處是更安全,由於 類型固定,潛在風險較低,還有編譯器給你作了一次保障



php幾天就能入門作出東西,主要是 資源太多,固然深刻並不容易。Java的話,就不要想了,深刻到安卓開發就更那啥了。我是作Vb轉到asp又轉到php,php我快熟透了。如今剛接觸Java,得須要時間,Java很嚴謹很健壯,不少地方不是php能比的,徹底不是一個層次。 php就是爲web而生的,Java的話轉安卓吧,畢竟屠龍術你會了得有龍。


沒有本質上的不一樣。要說多是Java編譯成爲字節碼,執行的時候不依賴原文件,只執行字節碼。有點相似於把c語言編譯成彙編的意思。對,是很相似。實際上php要執行,也要有這個過程,把程序原文件,編譯成命令集。而後程序的執行,只不過是按照順序執行命令集而已。只是說 Java編譯成命令集的過程只有一遍,而PHP則每次執行都要編譯
其實在大部分狀況下,這二者之間並不會產生較大的性能差別。並且 php也有相似於memcache,wincache,eAccelerator這樣的中間件,可使得字節碼的編譯只要一次,第一次編譯的字節碼會緩存在內存中,第二遍再也不從新編譯。
Java的一直再本身給本身定義的一個和php的不一樣,是叫作 企業級應用。言外之意好像再說php不適合作企業級應用。可是實際狀況卻很打擊java。 如今即便是企業級應用,市場也在逐漸被php吞噬了。爲了作企業級應用壘砌的高逼格,致使 學習成本加大,維護成本增長,開發週期延長。除了在一樣須要逼格陪襯的erp領域把相似金蝶這樣的軟件公司養的肥肥以外,基本上真正的互聯網公司大部分更鐘愛php。看看招聘網站就知道如今招聘php的比java的多多少。
 
 
JAVA是
一門強類型的靜態語言,幾乎什麼都能作。而PHP只是一個超文本解釋器而已,它的誕生之初只是爲了 網頁動態化早期的PHP的寫法偏向於面向過程。面向對象開發也很難作到像JAVA那樣大而全,不事後來 像反射這一類技術的改進,PHP進化到7,也支持強類型了。PHP在WEB服務器端開發也有很強的一席地位, 不過在複雜大型WEB系統中終究不是比不過像JAVA這一類的語言。別說Facebook用什麼PHP,人家核心都 HHVM了。
儘管如此, PHP還是世界上最好的語言它的易學,超簡單的熱部署,能讓初學者有很大的成就感。因此語言卻是越簡單越易上最好。像我大學剛開始學的C,處理字符串都要手動,後來學C++,感受C++比C方便多了,後來學JAVA,感受JAVA又比C++方便,直到從此的c#,PHP,Python...真是一個比一個用起來簡單。


1.php適合處理單線程,java適合處理多線程;
2.php適合處理業務需求,java適合處理後端數據;
3.php開發效率較高,同等任務,所需時間通常是java的1/2到1/3;
4.php更可能是面向過程開發,java是面向對象編程;
5.php程序員相對java程序員較便宜,薪資通常是其的70%左右;
6.php相對與java安全性較差;
7.php版本更新較快,java版本穩定,更新慢;
8.php適合中小型系統,java適合大型系統;
9.php易學難精,java入門困難精通更難;
10.php是將才,java是帥才;



編程最重要的思想,一個 只會copy、生成代碼、講速度,而 不重架構的程序員,能算得上是程序員嗎,典型的碼農



 
物盡其用。各自的長處不同,不必什麼語言鄙視,PHP原本就是作網站快速開發。總有些人以爲玩個二次編譯的強類型語言就比別人智商高了,菜鳥就是菜鳥,不是由於你用什麼寫程序就能改變的,還有JAVA的JVM和各大框架、無盡的類庫。JAVAer不都是用現成的?有幾個知道底層實現的細節? 用解釋語言笑動態腳本語言的時候。有沒有想過搞C/C++、彙編的人是若是笑你的真正懂的就不會在計算機語言上找存在感
相關文章
相關標籤/搜索