is_file ou file_exists em PHP

117

Preciso verificar se um arquivo está no HDD em um local especificado ($ path. $ File_name).

Qual é a diferença entre is_file()e file_exists()funções e que é melhor / mais rápido para uso em PHP?

Duncan Benoit
fonte

Respostas:

167

is_file()retornará falsese o caminho fornecido apontar para um diretório. file_exists()retornará truese o caminho fornecido apontar para um arquivo ou diretório válido . Portanto, dependeria inteiramente de suas necessidades. Se você quiser saber especificamente se é um arquivo ou não, use is_file(). Caso contrário, use file_exists().

hbw
fonte
1
até onde eu sei, if_file também falha para links simbólicos, não apenas para diretórios.
stefs
is_file () retorna verdadeiro se o arquivo existe no diretório ou falso se o arquivo não existe, pois verifiquei em 2020 pode ser a versão php atualize-o
heySushil
37

is_file()é o mais rápido, mas o benchmark recente mostra que file_exists()é um pouco mais rápido para mim. Então eu acho que depende do servidor.

Meu benchmark de teste:

benchmark('is_file');
benchmark('file_exists');
benchmark('is_readable');

function benchmark($funcName) {
    $numCycles = 10000;
    $time_start = microtime(true);
    for ($i = 0; $i < $numCycles; $i++) {
        clearstatcache();
        $funcName('path/to/file.php'); // or 'path/to/file.php' instead of __FILE__
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "$funcName x $numCycles $time seconds <br>\n";
}

Edit: @Tivie obrigado pelo comentário. Número alterado de ciclos de 1000 para 10k. O resultado é:

  1. quando o arquivo existir :

    is_file x 10000 1,5651218891144 segundos

    file_exists x 10000 1,5016479492188 segundos

    is_readable x 10000 3,7882499694824 segundos

  2. quando o arquivo não existe :

    is_file x 10000 0,23920488357544 segundos

    file_exists x 10000 0,22103786468506 segundos

    is_readable x 10000 0,21929788589478 segundos

Editar: moveu o clearstatcache (); dentro do loop. Obrigado CJ Dennis.

Lamy
fonte
7
para que este benchmark funcione, você deve adicionar clearstatcache (); já que os resultados para is_file e file_exists são armazenados em cache em todo o script. De qualquer forma, file_exists () é um pouco mais lento, mas não deve fazer nenhuma diferença a menos que você execute cerca de 100K verificações de arquivo. php.net/manual/en/function.clearstatcache.php
Tivie
1
Eu também encontrei is_file()mais rápido do que file_exists(). Se você sabe que é um arquivo (e não um diretório), use-o definitivamente.
Jonathan
1
Estranho, agora parece que 'file_exists' é mais rápido que 'is_file'.
weynhamz
7
Por que as pessoas estão interessadas em qual é mais rápido, porque essas duas funções têm comportamentos diferentes (conforme mencionado na resposta aceita, aquela testa se é um arquivo ou um link simbólico que aponta para um arquivo (mas não um diretório e não um link simbólico que aponta para um diretório) e o outro testa se é um arquivo (que também pode ser um diretório).
Brandin
2
@Brandin As pessoas estão interessadas porque em muitas situações você já sabe se está procurando um arquivo ou diretório, então se ele existe é a única coisa importante. Então, se is_dir()acabar sendo 20% mais rápido do que file_exists()(o que não acontece, aliás), isso pode ser uma diferença importante se você estiver apenas procurando dirs de qualquer maneira ...
Byson
1

Nem.

is_file () pode retornar verdadeiro se o arquivo não existir.

file_exists () pode retornar verdadeiro se o arquivo for um diretório.

Portanto, se ele precisa ser um arquivo e precisa existir, você precisa de ambos.

A velocidade não importa aqui porque eles não são iguais. Use apenas um se apenas uma função for importante e será mais rápido.

Brad
fonte
1

Sei que esse post é antigo, mas a diferença entre essas funções não está apenas no comportamento. Se você usar is_file () para verificar a existência de um arquivo grande, vá para mais de 2. Você vai se surpreender. Arquivo não existe. :( Mas se você verificar com file_exists (), isso funciona.

Juan - 6510866
fonte
0

is_fileseria mais rápido se usá-lo com barra invertida: \is_file. Neste caso, o PHP fornecerá otimização opcache nem file_existsnão.

SpinyMan
fonte