手游服務器php架構比較


從swoole項目開始到現在,一直有人在問這個問題。今天來抽空講一下它。為什么swoole非要使用純C來寫而不是PHP代碼來實現,核心的原因有2點:

1. PHP無法直接調用操作系統API

如sendfile、eventfd、timerfd、pthread等等,這里就不一一列舉了,所以純PHP實現的 phpdaemon,reactphp,還有最近剛剛出來的workerman。這些框架都是基於PHP的sockets/pcntl/stream /libevent擴展實現,提供的功能很有限,很多功能都無法實現。如

  • 多線程
  • 毫秒定時器(PHP中只有秒級的定時器)
  • 標准輸入輸出重定向
  • MySQL/CURL異步化
  • 守護進程化
  • sendfile
  • 其他更多

而C語言寫的swoole可以直接調用操作系統底層API,沒有局限,swoole可以實現任何功能特性。

2. PHP的內存管理粒度太粗

PHP中想要做內存管理太困難了,基本上只有Array可用。在高並發大負載的網絡Server中,內存復制簡直就是性能殺手。PHP中根本無法解決此問題。

舉一個簡單的例子,客戶端向服務器發起一個800K的包,每次發送8K,共發送100次。Server也會分成100次收到數據。那么PHP中 拼接此數據包的方法是 $package .= $recv_data 。共需要復制100次內存,第一次為 8K+ 8K,第二次是 16K + 8K,第三次24K + 8K,依次類推,僅僅一次請求就發生了大量的內存拷貝。如果每秒有10萬次請求,這個Server的性能必然極差。

而純C的代碼可以做到0次內存拷貝,在請求到來申請一塊800K的buffer內存,通過指針運算,直接將數據寫入buffer。一氣呵成,內存拷貝為0。

當然這里僅是其中一個小小的點,真正的代碼中不止這些。通過壓測也能發現,純C的swoole寫一個EchoServer,做-c 500 -n 100000的測試中,CPU始終在5%-10%之間。而PHP實現的PSF網絡Server框架,CPU占用率高達70%-90%。

以上也就是swoole和其他網絡框架的差異。除此之外swoole以擴展方式提供,免去了代碼中include php文件的問題。不需要去包含一堆外部文件,更容易融合到現有代碼中。使用者僅需掌握swoole擴展的API即可。reactphp提供了API封 裝,耦合程度較低。phpdaemon/workerman耦合太高,不是你的代碼集成它們,而是它們的代碼集成你的代碼。而且還需要了解其內部結構和耦 合關系。

再看swoole,它其實就像MySQL之類的擴展一樣,僅僅是作為一層API存在,耦合度非常低。swoole一直堅持低耦合高內聚,API化。用戶可以方便的將swoole的功能集成到自己的代碼中。

 

php到底能不能做手游服務器,我也不想多說,看一下《大掌門》的服務器架構圖

 

第一層是 slb,負載均衡。
第二層是web Server,服務器游戲邏輯塊。
第三層是cacheServer,常見的有redis,memcached.
第四層是數據庫。

現在你還敢說php不能做服務器么???

 

參考鏈接:http://rango.swoole.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM