Как и большинство языков программирования, PHP поддерживает работу с файлами, которые являются одним из способов хранения информации.
Для открытия файлов в PHP определена функция fopen(). Она имеет следующее определение:
resource fopen(string $filename, string $mode). Первый параметр $filename представляет путь к файлу, а второй - режим открытия. В зависимости
от цели открытия и типа файла данный параметр может принимать следующие значения:
'r': файл открывается только для чтения. Если файла не существует, возвращает false
'r+': файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false
'w': файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается
'w+': файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается
'a': файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются.
Если файл не существует, то он создается
'a+': файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается
Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.
После окончания работы файл надо закрыть с помощью функции fclose(), которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
fclose($fd);
Конструкция or die("текст ошибки") позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen
не смогла открыть файл.
Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets(), которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:
<?php
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
while(!feof($fd))
{
$str = htmlentities(fgets($fd));
echo $str;
}
fclose($fd);
?>
При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция
feof(), которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию
fgets().
Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents():
<?php
$str = htmlentities(file_get_contents("form.php"));
echo $str;
?>
При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.
Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread():
<?php
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
while(!feof($fd))
{
$str = htmlentities(fread($fd, 600));
echo $str;
}
fclose($fd);
?>
Функция fread() принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле
становится в конец этого блока. И также с помощью функции feof() можно отследить завершение файла.
Для записи файла применяется функция fwrite(), которая записывает в файл строку:
<?php
$fd = fopen("hello.txt", 'w') or die("не удалось создать файл");
$str = "Привет мир";
fwrite($fd, $str);
fclose($fd);
?>
Аналогично работает другая функция fputs():
<?php
$fd = fopen("hello.txt", 'w') or die("не удалось создать файл");
$str = "Привет мир";
fputs($fd, $str);
fclose($fd);
?>
При открытии файла для чтения или записи в режиме 'w', указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek, которая имеет следующее формальное определение:
int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ] )
Параметр $handle представляет дескриптор файла. Параметр $offset - смещение в байтах относительно начала файла, с которого начнется считывание/запись.
Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:
SEEK_SET: значение по умолчанию, устанавливает смещение в offset байт относительно начала файла
SEEK_CUR: устанавливает смещение в offset байт относительно начала текущей позиции в файле
SEEK_END: устанавливает смещение в offset байт от конца файла
В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.
Пример использования функции:
$fd = fopen("hello.txt", 'w+') or die("не удалось открыть файл");
$str = "Привет мир!"; // строка для записи
fwrite($fd, $str); // запишем строку в начало
fseek($fd, 0); // поместим указатель файла в начало
fwrite($fd, "Хрю"); // запишем в начало строку
fseek($fd, 0, SEEK_END); // поместим указатель в конец
fwrite($fd, $str); // запишем в конце еще одну строку
fclose($fd);