Java與PHPweb開發比較
一直很想寫一篇這樣的文章。Java和PHP作為web開發的2個主流語言,他們之間有什麼不同呢?在專案開發時,我們應該怎麼去做選擇。
1.執行方式
1.1 PHP的執行方式
客戶端傳送http請求到nginx,nginx通過fastcgi與php-fpm程序通訊。php-fpm執行完成後把結果返回給nginx,最終輸出到客戶端瀏覽器。
參考fastcgi:https://baike.baidu.com/item/fastcgi/10880685?fr=aladdin
1.2 Java的執行方式
Servlet容器,比如Tomcat和Jetty等。一個Servlet容器可以執行多個Servlet例項。
當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置檔案例項化這個Servlet類,此時它貯存於記憶體中。當有新的客戶端請求該Servlet時,一般不會再例項化該Servlet類,也就是有多個執行緒在使用這個例項。每一個請求都是一個執行緒,而不是程序,因此,Servlet對請求的處理的效能非常高。
參考:https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
總結:PHP是以多程序的方式執行,並且使用fastcgi與web通訊;Java需要依賴Tomcat等Servlet容器,以多執行緒的方式執行。
2.接受請求,GET/POST引數處理
JAVA | PHP | |
GET | 均是通過HttpServletRequest.getParameter方法獲取 GET/POST根據方法名定義doGet/doPost,如果是spring,使用RequestMapping定義 |
使用$_GET全域性變數獲取 |
POST | 使用$_POST全域性變數獲取 | |
原始請求體 | BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); String body = reader.readLine(); | file_get_contents("php://input"); |
請求來源IP | HttpServletRequest.getRemoteAddr方法 | $_SERVER["REMOTE_ADDR"] |
3.響應請求
JAVA | PHP | |
自定義狀態碼 | HttpServletResponse.setStatus(404); | header("HTTP/1.1 404 Not Found"); |
重定向 | response.sendRedirect("/hello"); | header("location: [url]"); |
4.Cookies & Session
JAVA | PHP | |
Session儲存 | 預設儲存在heap中,建立的cookies預設名稱是JSESSIOINID。servlet.destory()方法會導致session丟失。 |
預設使用檔案方式,儲存在/tmp目錄下,建立的cookies預設名稱是PHPSESSID。 重啟php-fpm並不會丟失資料。 |
呼叫方式 | 讀取:HttpServletRequest.getSession().getValue(name); 寫入: HttpServletRequest.getSession().setAttribute(name, value); |
讀取:$_SESSION['key'] 寫入:$_SESSION['key'] = mixed |