|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #78285 file_exists is 30 times slover than is_dir
Submitted: 2019-07-13 20:13 UTC Modified: 2019-07-15 17:06 UTC
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:0 (0.0%)
From: video dot ice dot power at seznam dot cz Assigned:
Status: Verified Package: *Directory/Filesystem functions
PHP Version: 7.3.7 OS: Windows 10
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please — but make sure to vote on the bug!
Your email address:
Solve the problem:
25 + 41 = ?
Subscribe to this entry?

 [2019-07-13 20:13 UTC] video dot ice dot power at seznam dot cz
file_exists() is 30 times slover than is_dir()

Test script:
for ($i = 0; $i < 1000; $i++) { is_dir('some path to directory'); } // 0.5ms

for ($i = 0; $i < 1000; $i++) { file_exists('some path to directory'); } // 15 ms

Expected result:
The file_exists method should run in about the same time as the is_dir method does.


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2019-07-15 09:49 UTC]
-Status: Open +Status: Verified -Assigned To: +Assigned To: cmb
 [2019-07-15 09:49 UTC]
    $t0 = hrtime(true);
    for ($i = 0; $i < 1000; $i++) {
    $t1 = hrtime(true);
    for ($i = 0; $i < 1000; $i++) {
    $t2 = hrtime(true);
    printf("is_dir      took %f ms\n", ($t1 - $t0)/10e6);
    printf("file_exists took %f ms\n", ($t2 - $t1)/10e6);

outputs for me something like:

    is_dir      took 0.051130 ms
    file_exists took 3.395850 ms
 [2019-07-15 17:06 UTC]
-Type: Bug +Type: Documentation Problem -Assigned To: cmb +Assigned To:
 [2019-07-15 17:06 UTC]
Actually, it is to be expected that file_exists() is much slower
than is_dir() (when the realpath cache is enabled), because the
former checks whether the file may be accessed, and since this
information is not cached, it is done for each and every call.

Changing to doc problem, since this behavior is not described in
the manual.
 [2020-04-18 07:37 UTC] maggus dot staab at gmail dot com
Maybe we could somehow produce a overview which sorts the often used (and similar) io functions from faster to more expensive ones.

I can think of


 [2020-10-09 15:58 UTC] bkfake-php at yahoo dot com
why does `is_file()` contain is_readable() functionality?
Separation of concerns

If I want to determine "is file" without regard to file permissions:.

file_exists($file) && !is_dir($file);    // file is a file!
is_file($file);  // file is a file I have permission to access
 [2020-10-09 21:52 UTC] divinity76 at gmail dot com
additionally, the fact that file_exists() returns false when it can see that the file clearly exists, but isn't readable, is a god-damn bug. if people want to know if a file is readable, we have is_readable() for that. i realize that due to BC-breaking, this can only be fixed in a major release like PHP8 or PHP9, though..
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Fri Sep 17 11:03:36 2021 UTC