對(duì)于許多創(chuàng)業(yè)公司,要做網(wǎng)站和手機(jī)App, 到底選擇Java還是PHP,是個(gè)很糾結(jié)的事情.
作為一個(gè)有10多年經(jīng)驗(yàn)的工程師,談?wù)剛€(gè)人看法.
開門見山砸王,先說結(jié)論.
一 結(jié)論
- PHP,Java各有優(yōu)劣,不要把問題想的太重大了僵芹,不妨舉重若輕处硬,任選一個(gè)都好.
- 主要看團(tuán)隊(duì)成員熟悉哪個(gè)語(yǔ)言,哪個(gè)語(yǔ)言能快速出產(chǎn)品拇派,并快速迭代更新.
二 詳細(xì)比較
PHP的優(yōu)點(diǎn)
- 簡(jiǎn)單荷辕, 開發(fā)效率高,是Java兩倍以上件豌,能快速出產(chǎn)品疮方,并快速迭代更新.
- 優(yōu)化簡(jiǎn)單,多數(shù)企業(yè)很容易獲取較好的性能
PHP的缺點(diǎn)
- 由于PHP-FPM IO 阻塞的特點(diǎn)茧彤,一個(gè)進(jìn)程同時(shí)只能處理一個(gè)請(qǐng)求骡显,像京東,小米這樣的搶購(gòu)情況下曾掂,大并發(fā)處理能力較差.
- 現(xiàn)在大學(xué)生學(xué)php的人少惫谤,不好招人.
Java的優(yōu)點(diǎn)
- 由于Tomcat非阻塞的特點(diǎn),一個(gè)線程可同時(shí)處理多個(gè)請(qǐng)求珠洗,大并發(fā)性能較好
- 大學(xué)生學(xué)Java的人多溜歪,好招人.
Java的缺點(diǎn)
- 配置復(fù)雜,開發(fā)效率較PHP低
- 很占內(nèi)存许蓖,性能優(yōu)化復(fù)雜蝴猪,如果優(yōu)化不好,性能反而不及PHP
三 高并發(fā)網(wǎng)站的架構(gòu)設(shè)計(jì)
其實(shí)許多初創(chuàng)公司的訪問量膊爪,遠(yuǎn)遠(yuǎn)沒有達(dá)到PHP或是JAVA撐不住的地步.
這里假設(shè)公司面臨像小米或是12306這樣的大并發(fā)訪問.
大并發(fā)情況下自阱,IO阻塞與非阻塞,性能差距是很大的.
查看一下Nginx, tomcat, php-fpm 的源碼米酬,我們發(fā)現(xiàn)沛豌,Nginx, tomcat使用的是非阻塞多路復(fù)用機(jī)制(對(duì)于linux, 底層就是epoll),一個(gè)線程可同時(shí)處理多個(gè)請(qǐng)求,而php-fpm是阻塞機(jī)制赃额,一個(gè)進(jìn)程同時(shí)只能處理一個(gè)請(qǐng)求.
(php-fpm 有個(gè)配置可以使用epoll琼懊,只適用于master管理進(jìn)程,對(duì)應(yīng)worker進(jìn)程還是阻塞的)
處理大并發(fā)的能力排名nginx第一爬早,tomcat第二哼丈,php-fpm第三.
對(duì)于像12306這樣的大并發(fā)情況,無(wú)論tomcat還是php-fpm都是瓶頸.
只有在nginx上做文章.
順便說下對(duì)于底層的IO多路復(fù)用,FreeBSD 的kqueue 性能要優(yōu)于Linux 的epoll.
以Nginx為中心的大并發(fā)架構(gòu)
首先筛严,Nginx負(fù)載均衡是必需的.這里主要講單臺(tái)服務(wù)器的架構(gòu)優(yōu)化設(shè)計(jì).
我們想醉旦,如果java和php 成為瓶頸,能繞過這個(gè)瓶頸就好.
回答是肯定的.
我們可以通過nginx插件直接訪問redis緩存,或是rabbitmq消息隊(duì)列里车胡,這就是OpenResty項(xiàng)目提供的功能
OpenResty 是一款基于 NGINX 和 LuaJIT 的 Web 平臺(tái), 可以使用簡(jiǎn)單的Lua語(yǔ)言訪問后端redis, rabbitmq,mysql 等服務(wù)檬输,充分利用Nginx的非阻塞大并發(fā)處理能力.
通過OpenResty,可直接在redis讀取緩存匈棘,而訂單這樣的操作丧慈,可以寫到rabbitmq消息隊(duì)列里.
這樣大并發(fā)都有nginx來處理,php 或是java 只是作為工具在后端更新下緩存和處理消息隊(duì)列主卫,這樣java和php 成為不再成為瓶頸逃默,這也是開篇時(shí),我說選擇php 或是java不重要的原因.
如果我們使用JWT認(rèn)證用戶簇搅,這個(gè)用戶檢查的工作也可由nginx來處理.
JWT認(rèn)證用戶設(shè)計(jì)完域,參看:
http://www.reibang.com/p/85d86877a1a6
Nginx JWT 認(rèn)證模塊,參看:
https://github.com/auth0/nginx-jwt
隨著公司規(guī)模的擴(kuò)大瘩将,對(duì)于消息推送吟税,需要同時(shí)大量TCP長(zhǎng)連接的情況,這時(shí)候golang語(yǔ)言開始登場(chǎng).
總結(jié)
對(duì)應(yīng)創(chuàng)業(yè)公司姿现,初期消息推送可用第三方服務(wù)肠仪,而對(duì)于以Nginx為中心的大并發(fā)架構(gòu)方案對(duì)應(yīng)很多初創(chuàng)公司也還用不到,真需要時(shí)备典,用戶規(guī)模已經(jīng)很大了.
所以說選擇Java和PHP 真的不是很關(guān)鍵的問題藤韵,關(guān)鍵的問題是團(tuán)隊(duì)熟悉哪個(gè)語(yǔ)言.