2011-06-29 65 views
5

從我的理解,如果你使用PHP緩存程序如APC,eAccelerator等,那麼操作碼將被存儲在內存中,以便在後續請求時更快執行。我的問題是,爲什麼不總是更好/更快地編譯你的腳本,假設你使用編譯器如phc甚至是HPHP(儘管我知道他們在動態構造方面有問題)?爲什麼還要存儲操作碼,因爲Zend引擎需要重新讀取操作碼,因爲Zend引擎使用C函數來執行操作,而您只需編譯並跳過該步驟?PHP緩存問題vs編譯

+0

還有這個問題的第2部分,我開始一個單獨的線程:http://stackoverflow.com/questions/6525187/why-are-dynamic-constructs-difficult-for-php-compilers-hphp – blacktie24

回答

2

你不能簡單地編譯爲c,並讓你的php腳本以相同的方式執行。 HPHP做了真正的編譯,但它不支持php特性的整個超集。

其他編譯器實際上只是在二進制文件中嵌入了一個php解釋器,所以你並沒有真正編譯代碼。

PHP並不打算編譯。操作碼緩存非常快,足以滿足99%的應用程序。如果您擁有Facebook的流量級別,並且您已經優化了後端數據庫,則編譯可能是提高性能的唯一方法。

PHP不是std c庫的薄層。

+0

gracias抽出時間回覆。當你說「PHP不是std c庫的薄層」時,你能進一步解釋你的意思嗎? – blacktie24

1

如果PHP沒有eval(),那麼可能會以(相對)簡單的方式進行直接PHP->編譯的二進制翻譯。但由於PHP本身可以通過eval()動態地動態構建/執行腳本,因此不可能執行全功能二進制。任何二進制文件都必須包含整個PHP,因爲編譯器不知道你的動態代碼可以做什麼。你會從一個小的1或2k腳本轉換成一個巨大的數兆字節的二進制文件。

+0

thx回覆!假設我不使用eval(),並且解決了動態構造的問題(在另一個線程中獲得了關於編譯器和動態構造的另一個問題,我在原始問題下發布了這個問題作爲註釋),那麼它會是高效地編譯? – blacktie24

+0

我不知道'高效',但不明白爲什麼它不可能。 –