php查詢資料庫用了一個c寫的擴展,這樣做有什麼好處呢?

我們公司php連接資料庫的model使用了一個c寫的擴展,這樣做有什麼好處呢?我認為僅是資料庫密碼安全方面的考慮,但是很多人跟我說一般出於效率方面的考慮,我覺得php的資料庫擴展php_mysql.so也應該是c寫的吧?難道隨便寫一個c擴展比apache寫的擴展更加高效?(我不知道php_mysql.so誰寫的)請大神解釋一下。

舉一個平時用得最多的操作

plus::sql($sql)-&>exec();

這個plus就是c寫的,暫不清楚有什麼作用


c語言與php相比主要是在運算上有優勢。io操作沒有任何差別,一個SQL執行需要100ms,無論c還是php都是100ms,沒有優化空間。

mysql客戶端主要是在協議解析上有較多開銷,所以才用c擴展實現來節約CPU的消耗提升性能。

要是php語言的性能能和Java一樣,那php底層只提供個tcp客戶端和位元組操作類就好了,mysql、redis、memcache等等客戶端就可以用php代碼實現。

可現實是php語言在運算上和c差了上百倍,即使是加了jit,比如hhvm,和c的性能差距仍然有10幾倍。性能是個量變引起質變的事情,這裡消耗一點那裡消耗一點,加起來就多了。

回到你的問題,一般PHP程序確實存在大量SQL拼接計算的操作,編寫一個model擴展確實可以提升性能。當然代價就是開發成本太高了。如果能分享出來做成開源項目所有PHPer都能受益。


謝腰。換工作吧。真沒任何必要這麼做。即便從安全形度也不需要。


同意你的看法。性能上且不說實現有多高明,優化的也只是協議的解析部分,網路傳輸和資料庫的查詢時間才是大頭,mysqlnd的實現也挺高效了。其實寫個簡單的查詢頁面,ab測試一下就能證明了。


如果僅僅是對簡單的增刪改查等php_mysql.so中已有的方法再次自己重新用c實現一個的話,基本上就是一個「重複造輪子、且不一定高明」的做法(當然也不排除實現的真的比通用方法高效的可能,只是可能性較小)。

而對於題主猜測是否有「安全性」有關,答案也是否定的。這樣做不僅不能將登陸mysql的賬號信息隱藏起來,還會令今後的調整難以進行(線上真實環境中,mysql伺服器的密碼可能是定期更換、或者根本不用密碼而用證書來進行授權)。

那麼自己重新實現一個擴展庫的好處和正確的應用場景在哪裡呢?

一、既然叫「擴展」,就是擴展出一些新的方法來,並封裝成可高度復用的方法:

例如在PHP級別的代碼中,經常有若干句SQL構成的一個操作集合,如果使用PHP源代碼來寫,代碼的復用度比較低、而用PHP封裝成一個類方法,復用度就上去了;

此時可以考慮將其用C封裝成一個擴展,不僅可以令復用度提高、還可以在不同的項目中使用、且因為是利用C實現的擴展,效率性能自然也會比用PHP封裝的更高一些。如此就是做成apache擴展的好處。

二、提升核心代碼的被盜門檻:

在利用PHP開發項目的時候,為了實現源代碼的「閉源」,最常用的做法是「代碼混淆」,Zend編譯成中間碼兩種方法,但是兩種方法都存在著一定的缺陷:代碼混淆的破解難度相對較低、且如果沒有搭建比較好的自動部署方法,會令自己的開發團隊陷入難以維護的可能;

Zend編譯其實沒有什麼不好,但最大的問題是——不是所有的甲方都認可在伺服器上安裝Zend的做法。例如我曾經接手的一個項目,對方就明確告知伺服器上使用LAMP環境、但不得引入Zend,且還需要對代碼進行加密。我考慮用代碼混淆,但是對方依然不接受,無奈就只能選擇將部分PHP代碼封裝成Apache擴展來解決這一問題。

三、其他:

除了上述的隱藏登錄賬號、核心代碼不外泄、提高代碼復用度和效率、在無法利用Zend加密的情況下進行變相加密之外,封裝成apache mod的小眾用法還體現在:

底層開發人員本身就是個C程序員,這情況我在16年前遇到過,當初PHP剛剛成為流行的時候,前端人員的能力水平其實都很一般,當然那個時候PHP語言自身的素質也一般般,如此再多重「一般般」的疊加下,做項目開發就會發現生產的項目「垃圾」且「緩慢」。

但是我公司的主力程序員都是擁有十年經驗的C程序員(其中有個程序員當初是搞電力站程序控制的,你可以想見他的C功底有多強)。

此時如果我要求他們現學現賣PHP來做Model層,就等於放棄了他們最厲害的C技能、轉而讓他們用半吊子PHP來做開發,再加上PHP當初的效能本身存在的問題,疊加之後的項目質量可以想見。那時候我就是直接讓C程序員用C高CGI或擴展,而只在頁面表現層讓公司的「實習生」來用PHP做,最後效果十分滿意。


PHP操作MySQL的底層擴展(mysqli,pdo_mysql)和驅動(mysqlnd)都是C實現的,擴展維護者可以在phpinfo()頁面中看到(從PHP7開始).

MySQL driver for PDO:
George Schlossnagle, Wez Furlong, Ilia Alshanetsky, Johannes Schlueter
MySQLi:
Zak Greant, Georg Richter, Andrey Hristov, Ulf Wendel
MySQLnd:
Andrey Hristov, Ulf Wendel, Georg Richter, Johannes Schlüter


這麼好的人肯定是為了裝逼了。拋開這麼干帶來的維護成本來講,就說所謂的性能,基本上寫擴展都是為了解決io密集型應用帶來的性能問題,然而mysql查詢這種典型的io密集型的應用。這麼干除了裝逼看不到什麼明顯優勢。

pdo封裝的很成熟,協議類的封裝也根本沒有必要。更何況牽扯到你的開發維護成本。。不敢想像。。。


提升性能和維護成本,成本高了工資也高


關鍵是c解決了什麼!緩存?並發?日誌?熱備?以上這些c語言優勢於php!如果只是io C也可以做成非同步非阻塞模型。


推薦閱讀:

Mac 下如何搭建 PHP 開發環境?
建站的主要流程?
MVC 模式前端應該寫模板嘛?
用 PHP 編寫支持高並發的網站,需要做什麼處理?

TAG:資料庫 | 程序員 | PHP | PHP程序員 | PHP開發 |