PHP, Filesystems and File I/O

Revision as of 16:54, 13 May 2009 by Neil (Talk | contribs)

Revision as of 16:54, 13 May 2009 by Neil (Talk | contribs)

PreviousTable of ContentsNext
Working with Strings and Text in PHPWorking with Directories in PHP


<google>BUY_PHP</google>


One of the benefits of PHP being a server side scripting environment is that it gives the web developer easy access to the filesystem of the server on which the web server is running. This gives us the ability to create, open, delete, read and write to files. We can also traverse the directory hierarchy of the server systems to do things like get directory listings and create new sub-directories (see Working with Directories in PHP).

In this chapter we will cover all aspects of interacting with files and the filesystem.

Opening and Creating Files in PHP

Existing files are opened, and new files created using the PHP fopen() function. The fopen() function accepts two arguments and returns a file handle which is subsequently used for all future read and write interactions with that file. The first argument is the name (including the path) of the file to open. This path is relative to the server filesystem root, not your web server root. The second argument is an attribute indicating the mode in which to open the file (create, read only, write only etc). The following table lists the various file open attributes together with a brief description of each:

<google>ADSDAQBOX_FLOW</google>

ModeDescription
rRead only access. Pointer is positioned at start of file.
r+Read and write access. Pointer is positioned at start of file.
wWrite only access. Pointer is positioned at start of file. File is created if it does not already exist.
w+Read and write access. Pointer is positioned at start of file. File is created if it does not already exist.
aWrite only access. Pointer is positioned at end of file. File is created if it does not already exist.
a+Read and write access. Pointer is positioned at end of file. File is created if it does not already exist.
xCreate and open for write only. Pointer is positioned at start of file. Return false if file already exists.
x+Create and open for read and write. Pointer is positioned at start of file. Return false if file already exists.

Closing Files in PHP

Once a file has been opened it can be closed using the fclose() function. The fclose() function takes a single argument - the file handle returned by the fopen function when the file was first opened.

Given this information we can write a script to open a file. For the purposes of this example we will create a new file in the /tmp directory of our web server. We will open the file in w+ mode so that it will be created if it does not already exist and provide both read and write access. We will then close the file using fclose():

<?php
$fileHandle = fopen('/tmp/php_essentials.txt', 'w+')
 OR die ("Can't open file\n");

fclose ($fileHandle);
?>

Writing to a File using PHP

Having created and opened the file the next task is to write data to the file. We can do this using the PHP fwrite() and fputs() functions. These are essentially the same function so either can be used.

fwrite() takes two arguments, the file handle returned from the original fopen() call and the string to be written. We can, therefore, extend our example to write a string to our file:

<?php

$fileHandle = fopen('/tmp/php_essentials.txt', 'w+')
 OR die ("Can't open file\n");

$result = fwrite ($fileHandle, "This line of text was written by PHP\n");

if ($result)
{
     echo "Data written successfully.<br>";
} else {
     echo "Data write failed.<br>";
}

fclose($fileHandle);
?>

After running the above script you should find a file exists on your server containing the line This line of text was written by PHP.

Reading From a File using PHP

Data can be read from a file using the PHP fread() function. fread() accepts two arguments, the file handle and the number of bytes to be read from the file:

<?php
$fileHandle = fopen('/tmp/php_essentials.txt', 'w+')
 OR die ("Can't open file\n");

fwrite ($fileHandle, "This line of text was written by PHP\n");


fclose($fileHandle);

$fileHandle = fopen('/tmp/php_essentials.txt', 'r')
 OR die ("Can't open file\n");

$fileData = fread ($fileHandle, 1024);

echo "data = $fileData";

fclose($fileHandle);

?>

The above example should generate the following output:

data = This line of text was written by PHP

Note the use of the "OR die()" syntax in the above example. The reason for this is to call the die() function if the specified file cannot be opened. The purpose of the built-in PHP die() function is to display a message (specified within the parentheses) and then exit the script. This prevents the remaining PHP code from executing and attempting to read from a file which could not be opened.

It is also possible to read and output the contents of an entire file with the readfile() function. This function reads the entire contents of a file and outputs that content. Assuming you don't need to do anything but output the contents of a file then readfile() is an easy solution because it does all the work for you. You do not need to open the file, read the data, close the file and display the data. All you need to do is call readfile() passing in the file path as an argument and it does the rest.

Checking Whether a File Exists

The file_exists function can be used at any time to find if a file already exists in the filesystem. The function takes a single argument - the path to the file in question and returns a boolean true or false value depending on the existence of the file.

Moving, Copying and Deleting Files with PHP

Files can be copied using the copy() function, renamed using the rename() function and deleted using the unlink() function. For example we can perform a number of tasks on our example file:

<?php

if (file_exists('/tmp/php_essentials.txt)
{
     copy ('/tmp/php_essentials.txt, '/tmp/php_essentials.bak'); // Copy the file

     rename ('/tmp/php_essentials.bak', '/tmp/php_essentials.old'); // Rename the file

     unlink ('/tmp/php_essentials.old'); // Delete the file
}
?>

Accessing File Attributes

PHP provides access to a wide range of file attributes such as when the file was created, whether the file is readable or writeable and the current file size.

The PHP stat() and fstat() functions provide a wealth of information about a file. The information is so copious that the results are returned as an associative array. The functions take a single argument. stat() takes a string defining the path to the file. fstat() takes a file handle returned from an fopen() function call.

The following table outlines the array values returned by both functions:

KeyDescription
devDevice number
inoInode number
modeInode protection mode
nlinkNumber of links
uidUser ID of owner
gidGroup ID of owner
rdevInode device type
sizeSize in bytes
atimeLast access (Unix timestamp)
mtimeLast modified (Unix timestamp)
ctimeLast inode change (Unix timestamp)
blksizeBlocksize of filesystem IO (platform dependent)
blocksNumber of blocks allocated

With reference to the above table we can now extract some information about a file on the file system of our server:

<?php

$results = stat ("/tmp/php_essentials.txt");

echo "File size is $results[size]<br>";
echo "File last modifed on $results[mtime]<br>";
echo "File occupies $results[blocks] filesystem blocks<br>";
?>

It is also possible to check the status of a file in terms of read and write access. The is_readable() and is_writable() functions take the path to file as an argument and return true or false. The is_link() function can similarly be used to identify whether the file is a symbolic link to another file.

PHP Output Buffering

Output buffering in PHP is a mechanism whereby content that would normally be sent directly to the output stream is initially held in a buffer until the buffer is flushed. This provides control over when output is presented to the user (perhaps in situations where there is a delay in gathering some data from a database for example).

Output Buffering is initiated using the ob_start() function. ob_start() can be called with no arguments but does support three optional arguments:

  • callback function - specifies a user defined function to be called before the buffer is flushed
  • bytes - an integer representing the number of bytes to be buffered before the callback is triggered. Set to null to disable this feature
  • delete buffer - Boolean value specifying whether buffer should be deleted after ob_end() call.

The contents of the buffer are flushed using the ob_flush() function. It is also to possible to both flush and stop future buffering using the ob_end_flush() function.

It is also possible to delete all buffer content without flushing with a call to the ob_clean() function.

Finally the contents of the buffer may inspected at any time using the ob_get_contents() function which returns a string containing the buffer content.

<?php

ob_start(); //start buffering

echo "This content will be buffered";   // write some content to the buffer

ob_end_flush(); // flush the output from the buffer

?>

<google>BUY_PHP_BOTTOM</google>