天天看點

關于C++、PHP和Swoole

昨天和一個前同僚聊天,各種吐槽PHP,吐槽Swoole,他認為PHP到處是坑,PHP局限很大。PHP+Swoole不适合做高并發伺服器,C+Swoole才是最好的方案。C++有各種資料結構,C++可以開線程,C++可以共享對象。看來有必要好好得說明一下了。

PHP比C/C++或Java少了什麼?多線程,多線程,多線程……

是的。PHP比C/C++、Java少了多了多線程。PHP隻有多程序的方案,是以PHP裡的全局變量和對象不是共享的、資料結構也不能跨程序操作、Socket檔案描述符不能共享等等。是以PHP有局限?

多線程看似比多程序要強大很多,實際上我可以負責任的告訴你,多線程帶來的坑更多。

資料同步問題會讓你崩潰的。要麼就犧牲性能到處加鎖,要麼就用地獄難度的無鎖并發程式設計,據我所知目前國内能掌握此項技能的人鳳毛麟角。

不要以為加鎖就萬事大吉了,你會在死鎖問題上栽個大跟頭。當你的程式邏輯複雜後,鎖越來越難控制了,一旦死鎖你的程式基本上就完了。

某個線程挂了那所有線程都會退出

反而在看多程序,其實就簡單的多了。

配合程序間通信,基本上你可以實作任意的資料共享。比如利用一個程序專門存資料結構和對象,其他程序的資料操作全部投遞到此程序來

多程序不需要鎖

多程序可以使用共享記憶體的資料結構實作一些多線程的功能。如Swoole提供的Table、Atomic可以實作資料共享,但成本很低。未來還會加入共享記憶體隊列

所謂PHP限制了Swoole,這完全是無稽之談。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以實作異步非阻塞的代碼邏輯。

C++寫出來的程式性能更好?

這完全是盲目的迷信,密集計算的程式C++确實是有優勢的。而并發伺服器核心是IO,并非大規模密集運算。C++從語言層面來看并沒有什麼優勢。另外C++中的大部分資料結構在PHP中都有對應的實作,實在不行自己寫個專門的擴充也能解決之。

高并發的伺服器單機能維持10W連接配接、每秒可處理3-5W筆消息收發。這種性能水準已經可以應用在BAT的核心系統上了。

開發效率快的意義是什麼?

這位同僚還說PHP開發Server雖然比C++快了,但是追求性能的極緻還是要用C++。我要告訴你效率高了究竟意義何在。開發一套好程式不是一件容易的事情,需要程式員投入大量時間和精力。開發效率提升的意義并不是簡單的我可以更少時間完工,而是剩下的時間你可以增加單元測試、修複BUG、提升使用者體驗、完善細節、提供配套工具、優化性能、增加關鍵日志、增加監控報警、增加容災方案。

參考文獻

[2]H. Berenson, P. Bernstein, J. Gray, J.Melton, E. O’Neil,and P. O’Neil. A critique of ANSI SQL isolation levels. InProceedings of the SIGMOD International Conference on Management of Data, pages1–10, May 1995.

[3]Michael J. Cahill, Uwe Röhm, and Alan D.Fekete. 2008. Serializable isolation for snapshot databases. In SIGMOD ’08:Proceedings of the 2008 ACM SIGMOD international conference on Management of data, pages 729–738, New York, NY, USA. ACM.

[4]Michael James Cahill. 2009. Serializable Isolation for Snapshot Databases. Sydney Digital Theses. University of Sydney, School of Information Technologies

[5] A. Fekete, D. Liarokapis, E. O’Neil, P.O’Neil, andD. Shasha. Making snapshot isolation serializable. www.codexueyuan.com In ACM transactions on database systems, volume 39(2), pages 492–528, June 2005.