2012-11-06 53 views
6

我正在構建一個產品實例使用主框架文件的框架,直到它有自己版本的該文件的副本。要做到這一點我也做了以下內容:PHP包括路徑順序和狀態緩存

set_include_path(MY_PRODUCT_ROOT.'/' . PATH_SEPARATOR . MY_FRAMEWORK_ROOT.'/'); 

所以,如果我把它include('view-users.php');將首先在MY_PRODUCT_ROOT尋找/view-users.php如果這沒有找到,它會隨即看向MY_FRAMEWORK_ROOT /視圖用戶.PHP。

此過程運行良好,直到我將文件添加到產品根目錄。我知道PHP/Apache正在緩存內容,並且有人會認爲運行clearstatcache(true);來清除任何狀態緩存。 PHP可能在其include()中使用file_exists;並認爲新文件仍然不存在。我試過重啓Apache沒有任何效果。

不幸的是,運行clearstatcache(true);也沒有幫助。只有一次我刪除了MY_FRAMEWORK_ROOT /文件它認爲清除緩存並再次嘗試,因此找到MY_PRODUCT_ROOT /文件。

林有點難倒了,我知道我們需要刷新的文件(S)是否存在不PHP/Apache的理解,但clearstatcache(true);沒有幫助...

任何想法?

UPDATE:更正,重新啓動Apache現在似乎有所幫助。我重申,當試圖將文件添加到MY_PRODUCT_ROOT,重疊現有MY_FRAMEWORK_ROOT文件,定製

UPDATE纔會出現這種情況:開發環境是Windows Zend服務器CE PHP 5.3.14,生產環境的Centos的Linux的httpd ,PHP 5.3+。在我的開發環境中啓用Zend優化器的事實可能會產生影響,也不會使用APC或任何其他緩存腳本

+0

更準確地說,重新啓動apache只在調用clearstatcache時才起作用。我實際上必須刪除框架文件,然後重新加載頁面,並將框架文件放回 – Prof83

+1

您是否啓用了apc緩存? (或另一個optcode緩存) –

+0

我也無法重現你的問題在php-5.3.3和apache 2.2.16上。你能否提供更多關於你的環境的信息? – Lars

回答

2

Zend Optimizer+通過操作碼緩存和優化加速PHP執行。它將預編譯的腳本字節碼存儲在共享內存中。這消除了從磁盤讀取代碼並在將來訪問時進行編譯的階段。爲了進一步提高性能,存儲的字節碼進行了優化以加快執行速度。

這是緩存包含中找到的文件內容,因此clearstatcache不起作用。我禁用了我的Zend Optimizer,現在它可以工作。

+1

請注意,你可能會接受你自己的答案。另外,如果一個'clearstatcache(true,true)'在Zend Optimizer +處於活動狀態時有所作用,您能否檢查一下?否則,您應該在產品主頁上提交錯誤報告。 – Lars

+0

謝謝@Lars會測試出來...... – Prof83