2009-08-10 61 views
8

有編譯PHP與參數之間的區別:編譯php模塊vs使用共享模塊?

--with-[extension name] 

,而不是僅僅將其編譯爲共享模塊,包括它的方式?是否有任何性能優勢?如果不是,你爲什麼要這樣做?

回答

0

任何性能優勢都可以忽略不計。這只是打包PHP構建的另一種選擇。

在我的Mac上,我使用了Marc Liyange’s build of PHP,其中包括內置的PostgreSQL支持。它的標誌是--with-pdo-pgsql。因此它不需要與pdo-pgsql共享庫一起分發。

如果他沒有用--with-pdo-pgsql構建,他需要分發pdo-pgsql共享庫並在php.ini中包含指令來加載它。當然,這只是一個小小的區別,但如果您知道您將使用該功能,則可以將其構建到PHP本身中。

1

也許這不會是一個完整的回答你的問題,但這裏是我已經能夠到目前爲止發現:有某種局部的答案在書中「擴展和嵌入PHP」由Sara Golemon撰寫(amazon;某些部分也可在谷歌圖書上找到)。

相關部分(一個在第56頁的頂帖)是:

有沒有想過爲什麼一些擴展使用--enable-extname和 一些配置使用 --with-extename是 配置? Functionnaly,兩者之間沒有區別。然而,在 實踐中,--enable意味着 的功能可以打開 ,而不需要任何第三方 庫。相反,--with是 ,意思是確實具有此類 先決條件的功能。

所以,不是表現一個字(我想,如果是有區別的,它僅僅是一個與「加載一個較大的文件」的「加載一個多個文件」物質);但這背後有一個技術原因。

我想這樣做是爲了使PHP本身不需要需要一個額外的外部庫,因爲一些擴展;使用正確的選項允許用戶自己啓用或禁用擴展,具體取決於它們是否已經具有該外部庫。

0

我想內特是正確的性能和這個選項只有幫助打包。

基本上用一個已編譯的模塊PHP可以直接調用模塊函數,但是在編譯之後,這個調用被翻譯成內存地址來調用。

在可加載模塊版本中,PHP將調用dl_open來加載庫,然後通過那裏的地址調用函數,就像編譯版本一樣。我想這個dl_open調用只在webserver啓動時完成一次,所以你可以忽略它。

2

也許在內存佔用的區別?

糾正我,如果我錯了,但內置模塊將在每個進程加載到內存中複製(因爲它是靜態鏈接),而共享模塊將只加載一次,並由所有PHP進程共享。

1

我注意到,當所有的函數加載爲共享模塊PHP頁面加載速度更快,CPU使用率更低,但一些命令行PHP函數不能正常工作。它的邏輯假設是共享模塊設置比大型靜態二進制更高效,因爲模塊只在需要時加載。