User Contributed Notes 46 notes

I needed to measure performance for a project, so I did a simple test with one million file_exists() and is_file() checks. In one scenario, only seven of the files existed. In the second, all files existed. is_file() needed 3.0 for scenario one and 3.3 seconds for scenario two. file_exists() needed 2.8 and 2.9 seconds, respectively. The absolute numbers are off course system-dependant, but it clearly indicates that file_exists() is faster.

In response to seejohnrun's version to check if a URL exists. Even if the file doesn't exist you're still going to get 404 headers. You can still use get_headers if you don't have the option of using CURL..

I wrote this little handy function to check if an image exists in a directory, and if so, return a filename which doesnt exists e.g. if you try 'flower.jpg' and it exists, then it tries 'flower[1].jpg' and if that one exists it tries 'flower[2].jpg' and so on. It works fine at my place. Ofcourse you can use it also for other filetypes than images.

If you are trying to access a Windows Network Share you have to configure your WebServer with enough permissions for example:

$file = fopen("\\siscomx17\c\websapp.log",'r');

You will get an error telling you that the pathname doesnt exist this will be because Apache or IIS run as LocalSystem so you will have to enter to Services and configure Apache on "Open a session as" Create a new user that has enough permissions and also be sure that target share has the proper permissions.

Note that realpath() will return false if the file doesn't exist. So if you're going to absolutize the path and resolve symlinks anyway, you can just check the return value from realpath() instead of calling file_exists() first

If the file being tested by file_exists() is a file on a symbolically-linked directory structure, the results depend on the permissions of the directory tree node underneath the linked tree. PHP under a web server (i.e. apache) will respect permissions of the file system underneath the symbolic link, contrasting with PHP as a shell script which respects permissions of the directories that are linked (i.e. on top, and visible).

This results in files that appear to NOT exist on a symbolic link, even though they are very much in existance and indeed are readable by the web server.

The following script checks if there is a file with the same name and adds _n to the end of the file name, where n increases. if img.jpg is on the server, it tries with img_0.jpg, checks if it is on the server and tries with img_1.jpg.<?php $img = "images/".$_FILES['bilde']['name'];$t=0; while(file_exists($img)){$img = "images/".$_FILES['bilde']['name'];$img=substr($img,0,strpos($img,"."))."_$t".strstr($img,".");$t++; }move_uploaded_file($_FILES['bilde']['tmp_name'], $img);?>

file_exists will have trouble finding your file if the file permissions are not read enabled for 'other' when not owned by your php user. I thought I was having trouble with a directory name having a space in it (/users/andrew/Pictures/iPhoto Library/AlbumData.xml) but the reality was that there weren't read permissions on Pictures, iPhoto Library or AlbumData.xml. Once I fixed that, file_exists worked.

My way of making sure files exist before including them is as follows (example: including a class file in an autoloader):

<?php
function __autoload($name)
{
$path = explode(":", ini_get('include_path')); //get all the possible paths to the file (preloaded with the file structure of the project)
foreach($path as $tryThis)
{
//try each possible iteration of the file name and use the first one that comes up
// name.class.php first
$exists = file_exists($tryThis . '/' . $name . '.class.php');
if ($exists)
{
include_once($name . '.class.php');
return;
}

There is a subtle difference in behaviour of file_exists(), depending on the OS. Suppose you test a path ending with a slash. If the corresponding filesystem object exists, but is not a directory but a file, file_exists() will return true on Windows and false on Linux.

I wrote a very simple function that allows you to search a folder for a file name with a regular expression. It can handle both PREG and EREG regexps and can accept different case sensitivities for EREG regexps.

If you simply want to check that some file (not directory) exists, and concerned about performance, try is_file() instead.I timed is_file and file_exists, it seems like is_file() is almost 2x faster when a file exists and about the same when it doesn't.

That is true feshi. But, if you have your server configured correctly, those access logs will only be accessible by an admin or the root account. The webuser account that runs the php script will be unable to start reading from that file. That's the easiest fix.

Small adjustment to the url_exist() by marufit at gmail dot com. Some sites like digg.com for example check the HTTPHEADER to see who is requesting the page and will PHP will throw an error. Adding the following line fixes the issue:

Nathaniel, you should read the manual carefuly next time prior to posting anything here, as all you indicated is the fact you missed the idea of the include_path. To remind - include_path is for some functions only, mainly intended for include and require to simpify include/require operations (kinda way the #include works). It is NOT for any filesystem function, which would be damn annoying than helpful, which is quite understandable and obvious.

Your function url_exists() does not work because it has got a big bug. curl_init does not make a connection to that url until curl_exec() is executed. The return value from curl_init() shows if a curl session can be started.

That function can be rewritten as follows

<?phpclass Url{/** * Check if an url is existed * * @param string $url * @access static * @return bool True if the url is accessible and false if the url is unaccessible or does not exist * @throws Exception An exception will be thrown when Curl session fails to start */public static function exists($url) { if (null === $url || '' === trim($url)) { throw new Exception('The url to check must be a not empty string'); }