2011-10-25 60 views
10

使用include文件很常見。我認爲它被濫用以保持代碼整潔而不考慮性能。對於多個include s,磁盤應該讀取這些文件,並且由於我們非常使用磁盤,所以它可能是一個緩慢的過程。但是,這不是主要的緩慢過程或速率限制過程,因爲使用file_get_contents加載文件的速度要快幾倍。閱讀是否包含文件減慢php腳本加載?

我認爲這是主要網站把javascript文件放在html文件中而不是通過文件加載它們的原因。另外,把一個大的JS文件分成幾個小的JS文件可能是一個好主意,因爲並行http請求可以更快地加載整個JS代碼。但是這與php文件不同,因爲php腳本在該過程中逐個讀取include文件。

  1. 請評論這個問題能有多嚴重?想象一下,一個網頁是在0.60s加載的,可以將include的10個PHP文件變成0.70s?

  2. 雖然這種影響應該可以忽略不計,但我想知道是否有辦法加快這個過程。我不是說像APC這樣的php緩存。

P.S.這個問題不適用於實際應用(典型案例),而是一般的理論考慮。

+0

使用'include'應該非常快,如果啓用APC則速度會更快。你在這裏追逐棍子的錯誤結局。 – Petah

+0

另外,由於連接處理開銷,並行請求通常較慢。簡單地將所有的JS文件組合起來放在文檔根目錄下,然後讓你的Web服務器(Apache)處理緩存。 – Petah

+0

這可能是非常嚴重的......如果您使用的是70年代的機器:p您需要運行PHP代碼的「快速」方式是什麼? 0.1s是否重要?它與高度可重用,靈活和可擴展的架構相比有多差? – LeleDumbo

回答

15

include之流是必需的。它與Java和python中的import類似,因爲它用於類和函數定義。 include應該非常快,但使用它會延遲腳本執行,如果它不在那裏。 includefile_get_contents()完全不同。後者是一個函數而不是一個構造,並返回一個字符串。 include將實際執行包含文件的代碼。

您關於分割JS文件的聲明不正確,因爲從相同域下載的腳本會阻止並行下載,並且通常建議儘可能少地包含一些內容。

我非常懷疑有多個include,假設所有必要都會降低頁面的性能。如果您遇到性能問題,請查看其他地方。

如果你想加快php,看看使用php編譯器。

+0

感謝您提供豐富的答案。我知道include和file_get_contents的區別。通過這種比較,我的意思是從磁盤讀取文件可以更快;那麼,速率限制步驟就是包含php的處理。 – Googlebot

+1

用於引用php編譯器。我一直懷疑php編譯器(由於相反的意見)。現在我必須試試:) – Googlebot

4

PHP必須解析代碼,無論它是在主要的PHP文件還是包含在內。把它放在包含中可能沒有什麼區別。磁盤速度沒有差別,因爲它會在第一次後被緩存。

+0

非常好的一點。它如何緩存?由APC? – Googlebot

+0

不,該文件被操作系統緩存(只是普通的磁盤緩存,PHP文件很容易適應)。 APC會緩存解析文件的結果。 – Ariel

6

是的,它的確如此。您曾經使用過的圖書館會因爲下面的許多內容而帶來性能損失。 以提高性能的最佳方法是:

  1. 放在一起在一個單一的一個
  2. 使用加速器包含的文件

它可以通過22倍加速解決方案。更多Here

5

考慮一下:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    include('somefile.php'); 
} 

(somefile.php) 
<?php 
// nothing here 

的index.php花費約爲115秒(對我來說)處理10萬次迭代,同時包括somefile.php,即使somefile.php有什麼也沒有。

然而:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    // no file included this time 
} 

現在的index.php需要0.002秒沒有包括()構建體來完成。

(index.php) 
for ($i=0; $i<100000; $i++) { 
    echo $i .'<br/>'; 
} 

index.php需要0.02秒來回復100,000次迭代$ i。

當然,這是一個非常極端的例子,由於大量的迭代,但它確實表明,通過簡單地包含一個包含構造,腳本執行時間可以相當指數地延遲。當你下次編寫一個有大量迭代的進程時,請考慮這一點。讀取/寫入大型XML文件等。最好讓代碼保持內聯,即使這意味着它不太「可管理」。 '因爲你不僅僅通過簡單地包含一個include()來增加~115秒(~2分鐘)的腳本執行時間,而且還要考慮include()(somefile.php)是否有它自己的進程執行。我的例子是簡單地添加一個include()構造。包含的文件不包含任何內容。

現在,包括文件在這裏和那裏的網頁,時間可以忽略不計。我只是指出include()構造確實需要額外的處理而不管它的內容。