我們知道:php支援c/c++寫的擴充模組。原因無他,因為php底層本質上就是c實現的,既然人家zend可以用c來實現現在php的這麼多功能函數,我們當然也可以了。這一篇博文不會討論如何去實現這樣一個擴充,只是分析一下原理和優缺點以及一些雜想。
1:為什麼要寫擴充呢?比如我要實現一個功能,我完全可以用php來書寫封裝一個函數,這樣足矣。為什麼要這麼費勁的去用c去擴充一個模組呢?好吧,你想:我用c語言去封裝一個函數,和用彙編去實現同樣功能的一個函數,你覺得哪個效率高?不言而喻,c實現的函數效率必然要比php的高。 在這一點上:很多人會有一個誤區,包括我自己原先也以為: 我用c/c++擴充實現了一個功能函數。在php中執行的時候不是一樣也要:先編譯產生opcode,然後再執行將其處理?這樣一來:前一個編譯的過程根本沒有任何省略啊?這個效率高談何說起? 注意了:這裡所說的高效率並不是從執行流程上來說的,無論是原本的源碼,還是你自己寫的擴充,其都要先編譯後執行,這個效率上區別不大(當然也是有區別的),真正導致效率不同的地方是:你用php來實現一個函數,是直接把這個函數體寫在php中,而用c/c++來擴充一個模組的話:你在php中只需要調用一下這個函數即可! 一個是只有一句函數調用,一個是整個函數體,編譯成opcode的工作量:後者是前者的n個數量級倍!更別提後邊的執行過程了。所以效率的區別就在於:最開始的編譯數量多少。
當然了,還有另外一個理由就是擴充你的php功能,比如說:出現一種新的資料庫,其已經放出了使用的c庫,但是php還不支援,這個時候我們就可以開發一個模組來讓php支援他。
2:那寫一個擴充複雜不複雜呢?php本身已經為你的擴充提供了架構,類似mfc或者qt那樣,你要做的只是找到架構中對應的位置去添加代碼實現你的功能,然後重新編譯下php源碼即可!當然了:你要實現自己的功能,是需要使用php提供的一些系統函數的。可能你會說了:我為什麼不可以使用標準c的一些函數呢?當然:你完全可以使用,而且php擴充架構對大部分c標準函數都完全支援。但是對於類似malloc這種記憶體管理函數的使用就完全不同了。這是因為:php在記憶體管理上使用了記憶體池!如果你對記憶體池原理很瞭解的話就明白:php為什麼不用malloc而使用自己封裝過後的記憶體配置函數了。所以:最好能用php的系統函數就用系統函數,否則:一很容易出現記憶體泄露二php原本做的一些最佳化你都無法使用。
3:雜想:知道php的c/c++擴充實現原理後,我就開始幻想:那是不是可以把qt的所有函數庫當做一個模組給載入進去呢?我覺得這事完全靠譜。這樣的話就很有意思了:使用者可以在瀏覽器中請求去建一個QWidget,而後server把這個widget的資訊或者解析過後的樣式直接返回給使用者瀏覽器····以前有朋友給我設想:未來可以在瀏覽器中打魔獸··哈哈,這個完全可以啊! 不過如此一來:用戶端這種概念會越來越淡化了。而且瀏覽器也得支援這種qt的資料類型和格式。不過html這東西也很不錯,完全可以用他取代ui庫。但是如此一來:瀏覽器的地位就顯得如此重要了,以後會不會之間簡化瀏覽器的樣式使其不再單純是一個應用程式,而是一個server這樣的概念,使用者可以隨處使用它呢?這樣一來:雲端運算和雲端儲存就真的實現了!!狂想,狂想······O(∩_∩)O~