對于許多創(chuàng)業(yè)公司,要做網站和手機App, 到底選擇Java還是PHP,是個很糾結的事情. 作為一個有10多年經驗的工程師,談談個人看法. 開門見山,先說結論. 一 結論
二 詳細比較PHP的優(yōu)點
PHP的缺點
Java的優(yōu)點
Java的缺點
三 高并發(fā)網站的架構設計其實許多初創(chuàng)公司的訪問量,遠遠沒有達到PHP或是JAVA撐不住的地步. 這里假設公司面臨像小米或是12306這樣的大并發(fā)訪問. 大并發(fā)情況下,IO阻塞與非阻塞,性能差距是很大的. 查看一下Nginx, tomcat, php-fpm 的源碼,我們發(fā)現,Nginx, tomcat使用的是非阻塞多路復用機制(對于linux, 底層就是epoll),一個線程可同時處理多個請求,而php-fpm是阻塞機制,一個進程同時只能處理一個請求. (php-fpm 有個配置可以使用epoll,只適用于master管理進程,對應worker進程還是阻塞的) 處理大并發(fā)的能力排名nginx第一,tomcat第二,php-fpm第三. 對于像12306這樣的大并發(fā)情況,無論tomcat還是php-fpm都是瓶頸. 只有在nginx上做文章. 順便說下對于底層的IO多路復用,FreeBSD 的kqueue 性能要優(yōu)于Linux 的epoll. 以Nginx為中心的大并發(fā)架構 首先,Nginx負載均衡是必需的.這里主要講單臺服務器的架構優(yōu)化設計. 我們想,如果java和php 成為瓶頸,能繞過這個瓶頸就好. 回答是肯定的. 我們可以通過nginx插件直接訪問redis緩存,或是rabbitmq消息隊列里,這就是OpenResty項目提供的功能 OpenResty 是一款基于 NGINX 和 LuaJIT 的 Web 平臺, 可以使用簡單的Lua語言訪問后端redis, rabbitmq,mysql 等服務,充分利用Nginx的非阻塞大并發(fā)處理能力. 通過OpenResty,可直接在redis讀取緩存,而訂單這樣的操作,可以寫到rabbitmq消息隊列里. 這樣大并發(fā)都有nginx來處理,php 或是java 只是作為工具在后端更新下緩存和處理消息隊列,這樣java和php 成為不再成為瓶頸,這也是開篇時,我說選擇php 或是java不重要的原因. 如果我們使用JWT認證用戶,這個用戶檢查的工作也可由nginx來處理. 隨著公司規(guī)模的擴大,對于消息推送,需要同時大量TCP長連接的情況,這時候golang語言開始登場. 總結對應創(chuàng)業(yè)公司,初期消息推送可用第三方服務,而對于以Nginx為中心的大并發(fā)架構方案對應很多初創(chuàng)公司也還用不到,真需要時,用戶規(guī)模已經很大了. 所以說選擇Java和PHP 真的不是很關鍵的問題,關鍵的問題是團隊熟悉哪個語言. ![]() |
|
來自: flyk0tcfb46p9f > 《電腦》