Как и большинство языков программирования, 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);