PHP’s include_once() Is Insanely Expensive

I’ve always heard the include_once() and require_once() functions were computationally expensive in PHP, but I never knew how much. I tested the following out on my i7 2010 MacBook Pro using PHP 5.3.4 as shipped by Apple.

This first test uses include_once() to keep track of how often a file is included:

$includes = Array();
$file = ‘benchmarkinclude’;
for($i=0; $i < 1000000; $i++){

Took: 10.020140171051 sec

This second example uses include() and uses in_array() to keep track of if I loaded the include:

$includes = Array();
$file = ‘benchmarkinclude’;
for($i=0; $i < 1000000; $i++){
    if(!in_array($file, $includes)){
        include($file . ‘.php’);
        $includes[] = $file;

Took: 0.27652382850647 sec

For both, the include had the following computation:

$x = 1 + 1;

Lesson learned: Avoid using _once if you can avoid it.

Update: That means something like this will theoretically be faster:

$rja_includes = Array();
function rja_include_once($file){
    global $rja_includes;
    if(!in_array($file, $rja_includes)){
        $rja_includes[] = $file;

18 thoughts on “PHP’s include_once() Is Insanely Expensive

  1. Makes one wonder how *_once() is actually implemented, since you apparently implemented it in a way that was about 3600% faster…

  2. @Preed: I’ve been meaning to look it up, just haven’t had the chance. I first suspected (I don’t actually know) it does file_exists(), and perhaps other verification. But that seems unlikely as the distribution of the several times I tested this was pretty tight, I would have expected file IO to create a much larger distribution, or tail off once it’s cached. I saw nothing to that effect.

  3. I agree with you, but your solution isn’t correct because include path may implement multiple path.
    You should use :

    $path = substr($file,0,strrpos(“/”));
    $file_name = substr($file,strrpos(“/”));
    $rja_includes[] = realpath($path).$file_name;

    instead of

    $rja_includes[] = $file;

    And I think that’s why include_once is so slow :-)

  4. @Blusky: Not really. include() uses the first path that’s true. This is repeatable. So your key is the same regardless of the path chosen in the backend.

  5. No, imagine you have the following hierarchie :

    a.php -> include_once(“b.php”);
    b.php -> include_once(“a/a.php”);
    a/a.php -> include_once(“b.php”);

    Will you include the second b.php ?

  6. Assuming duplicate file names isn’t a bad practice already… you should always use absolute paths to your includes. It’s much faster. Disk IO is the biggest bottleneck on a server. Anyone who would use this sort of optimization is already doing that (I can’t think of many php open source projects that don’t do that already). Otherwise you’re essentially going through your path dir’s and doing a file_exists(), that means disk latency.

    I don’t think that use-case really exists for those reasons. This is an optimization, not a catch all.

  7. the reason why include_once and require_once is slower because it normalizes the path first (so in “/web/dir/mi.php” calling include(“../includes/foo.php”) will process it to “/web/includes/foo.php”).

  8. Correction… PHP include is insanely expensive 😀

    I tried taking your original include_once and just replace include_once with include and then test speed difference.

    $ time php incNormal.php

    real 0m29.794s
    user 0m13.477s
    sys 0m15.541s

    $ time php incOnce.php

    real 0m2.569s
    user 0m1.216s
    sys 0m1.336s

    Also, as others have pointed out, your code is not functionally the same as include_once.

  9. The author has claimed it totally wrong here.
    This test has nothing to do with the time cost of include or include_once.

    In the test code, you are checking if the files was included or not when testing for include but for include_once, you are not.

    Hence, for the include_once, it is executing the statement 1000000 times, while for the include, it is executing the statement only once.

    The test does not prove anything as they differ by the fact that it is executed.

  10. your benchmark comparision is not practical, as the $includes array always only contains one item. It will make a difference if this array get’s larger and the strings in it possibly longer (with subpaths and such).

  11. 、まともなポスト。私はこのトピックを熟考するので、共有していただきありがとうございますされています。私はおそらくあなたのポストに到着し戻ってきます。もう一度あなたのブログを訪問してなることを良いディーセント·ワークの
    [url=]送料無料!2015年 新作【花魁 高級変わり織り浴衣 黒地に凛と咲く憂いの淡色糸菊(d4906)】ホンコンマダム ゆかた 和装 和服 大人 レディース 女性 かわいい おしゃれ ギャル 派手 個?[/url]

  12. 私はしていただきありがとうございます絶対に何も} | 何もないように見える |それが見 UNCOVER |発見| |見つけ関数}私は{見つけることでした。その理由は、ということで、これは本当にあるこのような有益なポスト。 読み取るので私はこれのためにあなたに感謝したいと思いました。 I 確か |それのビットごと小さな小さなを満喫私がしたあなたがするブックマークし、新しいチェックアウトあなたが投稿するもの。こんにちは
    [url=]gym-g133390【gym master/ジムマスター】壺車杢スウェットクライミングパンツ G133390 正規品:SNB-SHOP[/url]

  13. 2015ブランド財布コピールイヴィトン財布コピー,シャネル財布コピー,グッチ財布コピー,エルメス財布コピークロエ財布コピー,ブラダ財布コピー,ブルガリ財布コピー,ドルチェ&ガッバ―ナ財布コピーバレンシアガ財布コピー,ボッテガ.ヴェネタ財布コピーロレックス時計コピー,ブルガリ時計コピー,フランク ミュラー時計コピーシャネル時計コピー,カルティエ時計コピー_オメガ時計コピー,IWC時計コピールイヴィトン時計コピー,オーデマ ピゲ時計コピー,ブライトリング時計コピーコピーブランド、ブランド激安、人気ブランドの販売、通販、オークション、新作のスーパーコピーブランドコピー、韓国スーパーコピー、ブランド激安、偽物ブランド、ブランドバッグ、激安かばん、ルイヴィトン偽物、財布激安.商品は全く写真の通りです。
    スーパーコピー商品、ブランドコピ ー財布、偽物バッグコピー財布コピーN 級品、ブ ランドスーパーコピー商 品、グッチ財布コピー,ミュウミュウ 財布激安。ブランドスーパーコ ピー銀座、ランドスーパーコピー財布。ブラ ンドスーパーコピー代引き、ブランドスーパーコピー専門店、ご購入する度、ご安心とご満足の届けることを旨にしておりますよろしくお願いします ありがとうございます

  14. スーパーコピーブランド格安販売店はこちらへ!品々の激安価格に持ったスーパーコピーブランド 代引きの新作はお客様に提供されます。安心、迅速、確実、お客様の手元にお届け致します。★弊社は9年の豊富な経験と実績を持っております。★一流の素材を選択し、精巧な作り方でまるで本物のようなな製品を造ります。★品質を重視、納期も厳守、お客様第一主義を貫きは当社の方針です。★驚きの低価格で商品をお客様に提供致します!★早速に購入へようこそ!
    2015年の新素材-新作!高品質 腕時計高品質の追求 超N品を良心価格で提供詳しくは以下のようなブランドがあります。HERMES(バッグ、財布、時計) CHANEL(バッグ、財布、時計)LOUIS VUITTON(バッグ、小物、財布、時計) BVLGARI(財布、時計)Christian Dior(バッグ、財布) COACH(バッグ、財布)GUCCI(バッグ、財布) ROLEX(時計)OMEGA(時計) IWC(時計)FRANCK MULLER(時計) HUBLOT(時計)クロエ CHLOE バッグなどです。ご不明点が ございましたらお気軽にお問い合わせください

    業界最高峰のブランドコピー 激安、コピーブランド、スーパーコピーブランド(N級品)通販専門店!ブランドコピー,コピーブランド,スーパーコピーブランド,ブランドコピー 激安,偽物ブランド、偽物のバッグ、腕時計、財布など激安で買える!全部のスーパーコピー販売品物のなかで私達のブランド激安が一番有名です

Leave a Reply

Your email address will not be published. Required fields are marked *

Connect with Facebook