PHP和Node.js分別是服務器端編程語言和JavaScript運行環境,二者在網絡應用程序中具有重要的地位。性能作為語言的核心指標,對于單頁應用或web應用的響應時間和服務器的負載承受能力影響深遠。本文將會重點關注PHP和Node.js的性能, 并用實例說明其差異所在。
PHP在處理常規網站后端業務的時候,例如查詢、插入數據等一些中低負載的業務變化下,PHP的響應時間比Node.js的響應時間好得多。而在處理高負載的業務時,Node.js顯然比PHP表現更出色。
一段簡單的PHP代碼: public function getArticleList(){ $result = $this->db->query('SELECT * FROM article'); return $result->fetch_all(MYSQLI_ASSOC); }
一段簡單的Node.js代碼: async function getArticleList() { let result = await db.query('SELECT * FROM article'); return result; }
兩份代碼實現的是同一件事——從數據庫中獲取文章列表。我們假設數據庫中有1千條文章數據,使用PHP和MySQL解析一次需要60ms左右;使用Node.js和MySQL解析一次只需要13ms左右。確實相差不小。
對于應用程序的狀態保留,PHP很難完成,并且需要使用不同的技術才能實現。相比之下,Node.js有一個優秀的文件系統API可以用于存儲和管理應用程序的狀態。這意味著,對于需要保留開放式連接的應用程序,Node.js將遠遠優于PHP。比如在線聊天室。PHP將每個請求視為獨立的請求,而不理會任何之前的狀態。
PHP寫的一個簡單的websocket服務器: class WebSocketServer{ private $sockets = []; public function __construct($host, $port){ $master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed"); socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed"); socket_bind($master, $host, $port) or die("socket_bind() failed"); socket_listen($master, 20) or die("socket_listen() failed"); $this->sockets[] = $master; while (true){ $read = $this->sockets; if (socket_select($read,$write=NULL,$except=NULL,0)< 1){ continue; } if (in_array($master, $read)) { $client = socket_accept($master); if ($client){ array_push($this->sockets, $client); //將連接添加到sockets中 } unset($read[ array_search($master, $read) ]); } foreach ($read as $socket){ $bytes = @socket_recv($socket, $buffer, 2048, 0); if ($bytes< 9){ //bytes長度為9,為握手,也是websocket的驗證 $this->close_sock($socket); continue; } $msg = $this->_decode($buffer); //獲取數據 array_push($this->everReadData, $msg); //把說話內容添加到數組everReadData中 if (is_callable($this->callback)){ //執行回調函數, $msg就是發送的消息 call_user_func( $this->callback, $this, $socket, $msg ); //回調函數就是自定義的處理函數 } } } } }
Node.js寫的websocket服務: let WebSocket = require('ws') let wss = new WebSocket.Server({ port: 8080 }) wss.on('connection', function connection(ws, req) { ws.on('message', function incoming(message) { wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { client.send(message); } }); }); });
Node.js不但更加簡單靈活而且支持websocket。使用Node.js可以非常簡單地實現一個websocket聊天室,而PHP很難做到這一點。
綜上所述,PHP在簡單面向對象的代碼實現中可以比Node.js更高效,但當高并發情況下Node.js的表現要更出色。同時,Node.js在底層控制和網絡開放連接方面表現更好,更適合于構建節點重的應用程序,例如聊天室和游戲,而PHP則更適合于簡單的網站后臺業務。