2013-02-06 20 views
3

這已經在我腦海中持續了很長一段時間,我想我應該尋求專家的回答。 我想知道它是否是一種糟糕的編程技術,通過單個文件彙集所有PHP請求。我一直在網站上工作,不確定它是否會隨着增長而擴大規模,因爲我不是100%確定PHP如何處理include()函數。如果include()是有條件的,即使條件不滿足,PHP是否會包含該文件?

爲了更好地解釋我是如何在這裏建立我的準框架是我的根.htaccess文件的一個片段:

# > Standard Settings 
RewriteEngine On 

# Ignore all media requests 
RewriteRule ^media/ - [L] 

# Funnel all requests into model 
RewriteRule ^(.*)$ _model.php [QSA] 

所以除了媒體目錄中的內容都被傳遞到這個簡單的腳本。

Inside _model.php我有我所有的輸入sanitisation,用戶身份驗證,會話數據從數據庫中獲取,任何全局變量(常用的變量,如$ longTime,$ longIP等)被設置。請求通過解釋變量$_SERVER["REQUEST_URI"]進行路由。

基本上我有一個switch()聲明,它選擇哪個模塊到include()。我不明白的是:當PHP執行時,它是否會執行每一個include(),而不管case指令是否爲真?

我擔心時間後,我將有很多這些模塊的 - 如果PHP確實在運行時包括所有它最終會佔用過多的處理能力和內存模塊...

-

編輯:
我真的只是問,如果PHP會'讀'它可能可能包含的所有文件。我知道它不應該實際執行代碼。 如果我的一個include()是一個需要很長時間處理的2GB文件,PHP會在執行前始終讀取該文件嗎?

- 編輯:
我找到了另一個類似的問題(我沒有張貼此人之前搜索了很多) PHP behavior of include/require inside conditional

我想我可以關閉這個功能。

+0

不,您的代碼中有一些錯誤。 – 2013-02-06 10:48:07

+0

@Akam我的代碼工作正常 - 我不問代碼中的錯誤。只是想知道PHP在執行之前是否會讀取所有潛在的包含文件。 – cstrat

+0

我認爲不是,一定不是 – 2013-02-06 10:50:14

回答

2

不,PHP將執行include代碼片段到達的時刻。

這是非常重要的,因爲你可以直接用php代碼包含代碼。例如。

文件1:

<?php echo "Foo"; ?> 

文件2:

<?php 
    echo "Before"; 
    include("File1"); 
    echo "After"; 
?> 

有時候你的PHP處理器甚至不知道在編譯時要包括哪些文件。想象一下像include("File".mt_rand(1,10));。 PHP不會知道文件名到達include語句的時刻。

+0

這是一個很好的觀點。所以我的方法和結構在這個意義上並不是有缺陷的! – cstrat

2

即使條件不符合,PHP會包含文件嗎?

不,includerequire語句以與其他PHP語句相同的方式進行解釋和評估。在執行之前,PHP不會掃描包含的腳本。

這可以用一個簡單的測試來驗證:

if(false) 
{ 
    include('does_not_exist.php'); 
} 

上面不產生錯誤或警告。如果包括被執行之前閱讀,你會看到這樣的警告:

警告:包括(does_not_exist.php):未能打開流:沒有這樣的文件或目錄...

警告:包括():失敗打開'does_not_exist.php'包含...

+0

是的,我知道這是事實(破碎的文件沒有包含在內 - 我在網站上被模塊錯誤地鏈接了),但我認爲PHP可能做了一些簡潔的嘗試並加速執行通過嘗試將內容加載到內存中......我猜不是! – cstrat

+1

謝謝!我認爲這就像C在執行前評估過的那樣。謝謝。 :) –

+0

感謝提醒@MrCode - 我接受了其他答案,因爲他的發佈是第一次。這兩個貢獻都非常有幫助。 – cstrat