對於許多創業公司,要作網站和手機App, 到底選擇Java仍是PHP,是個很糾結的事情. 做爲一個有10多年經驗的工程師,談談我的見解. 開門見山,先說結論. ##一 結論php
##二 詳細比較 ###PHP的優勢java
###PHP的缺點mysql
###Java的優勢linux
###Java的缺點nginx
##三 高併發網站的架構設計git
其實許多初創公司的訪問量,遠遠沒有達到PHP或是JAVA撐不住的地步.github
這裏假設公司面臨像小米或是12306這樣的大併發訪問.golang
大併發狀況下,IO阻塞與非阻塞,性能差距是很大的. 查看一下Nginx, tomcat, php-fpm 的源碼,咱們發現,Nginx, tomcat使用的是非阻塞多路複用機制(對於linux, 底層就是epoll),一個線程可同時處理多個請求,而php-fpm是阻塞機制,一個進程同時只能處理一個請求. (php-fpm 有個配置可使用epoll,只適用於master管理進程,對應worker進程仍是阻塞的) 處理大併發的能力排名nginx第一,tomcat第二,php-fpm第三.redis
對於像12306這樣的大併發狀況,不管tomcat仍是php-fpm都是瓶頸. 只有在nginx上作文章. 順便說下對於底層的IO多路複用,FreeBSD 的kqueue 性能要優於Linux 的epoll. ###以Nginx爲中心的大併發架構 首先,Nginx負載均衡是必需的.這裏主要講單臺服務器的架構優化設計.sql
咱們想,若是java和php 成爲瓶頸,能繞過這個瓶頸就好. 回答是確定的. 咱們能夠經過nginx插件直接訪問redis緩存,或是rabbitmq消息隊列裏,這就是OpenResty項目提供的功能
OpenResty 是一款基於 NGINX 和 LuaJIT 的 Web 平臺, 可使用簡單的Lua語言訪問後端redis, rabbitmq,mysql 等服務,充分利用Nginx的非阻塞大併發處理能力 . 經過OpenResty,可直接在redis讀取緩存,而訂單這樣的操做,能夠寫到rabbitmq消息隊列裏.
這樣大併發都有nginx來處理,php 或是java 只是做爲工具在後端更新下緩存和處理消息隊列,這樣java和php 成爲再也不成爲瓶頸,這也是開篇時,我說選擇php 或是java不重要的緣由.
若是咱們使用JWT認證用戶,這個用戶檢查的工做也可由nginx來處理.
JWT認證用戶設計,參看: http://www.jianshu.com/p/85d86877a1a6
Nginx JWT 認證模塊,參看: https://github.com/auth0/nginx-jwt
隨着公司規模的擴大,對於消息推送,須要同時大量TCP長鏈接的狀況,這時候golang語言開始登場.
###總結 對應創業公司,初期消息推送可用第三方服務,而對於以Nginx爲中心的大併發架構方案對應不少初創公司也還用不到,真須要時,用戶規模已經很大了. 因此說選擇Java和PHP 真的不是很關鍵的問題,關鍵的問題是團隊熟悉哪一個語言.