Чтение файла: file_get_contents()
С помощью функции file_get_contents() можно получить содержимое файла:
<?php
# Получение информации из файла
$data = file_get_contents('data.txt');
var_dump($data);
Также мы можем получить html-код какой-либо страницы в интернете:
<?php
echo '<textarea>';
echo file_get_contents('https://ya.ru');
echo '</textarea>';
Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.
Чтение файла: file()
Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.
Создадим в корне сайта файл data.txt со следующим содержимым:
Vasya
Petya
Gosha
Теперь запустим скрипт index.php со следующим кодом:
<?php
$arr = file('data.txt');
echo '<pre>';
var_dump($arr);
При запуске этого скрипта мы получим в браузере:
array(3) {
[0]=>
string(7) "Vasya
"
[1]=>
string(7) "Petya
"
[2]=>
string(5) "Gosha"
}
Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.
Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES:
<?php
$arr = file('data.txt', FILE_IGNORE_NEW_LINES);
echo '<pre>';
var_dump($arr);
Теперь у всех строк будет по 5 символов.
Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES:
<?php
$arr = file('data.txt', FILE_SKIP_EMPTY_LINES);
Разумеется, мы можем передать сразу две константы:
<?php
$arr = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
Создание файла и запись в файл: file_put_contents()
Функция file_put_contents() позволяет создать файл и заполнить его данными.
Первым параметром функция принимает путь к файлу, вторым - строку с данными. Для создания пустого файла нужно передать вторым параметром пустую строку.
<?php
// Создаём файл и записываем в него строку 'Vasya'
file_put_contents('data.txt', 'Vasya');
// Создаём пустой файл
file_put_contents('data.txt', '');
Если файла не существует - он будет создан. Если существует - данные в файле будут перезаписаны.
Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND:
<?php
file_put_contents('data.txt', 'Данные', FILE_APPEND);
Также вторым параметром можно передать массив:
<?php
file_put_contents('data.txt', ['Один', 'Два', 'Три'], FILE_APPEND);
Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:
<?php
$arr = ['Один', 'Два', 'Три'];
// Разделим элементы запятой
$str = implode(',', $arr);
// Или можно разделить их символом переноса строки
$str = implode("\n", $arr);
file_put_contents('data.txt', $str);
Создание папки или структуры папок
Создать папку можно с помощью функции mkdir() (make directory):
<?php
mkdir('new_folder');
Вторым параметром указываются права доступа к файлу в виде восьмеричного числа, по-умолчанию это 0777, что означает самые широкие права. Для Windows этот аргумент игнорируется.
<?php
mkdir('new_folder', 0755);
Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod():
<?php
mkdir('new_folder', 0777, true);
chmod('new_folder', 0777);
Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true:
<?php
mkdir('folder1/folder2/folder3', 0755, true);
Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:
<?php
mkdir('folder1/folder2/folder3', 0755, true);
chmod('folder1', 0755);
chmod('folder1/folder2', 0755);
chmod('folder1/folder2/folder3', 0755); // Если нужно проигнорировать umask
Права доступа - это отдельная объёмная тема, поэтому сейчас мы её пока рассматривать не будем.
Проверка существования файла или папки
Проверить существование папки или файла можно с помощью функции file_exists():
<?php
if(file_exists('data.txt'))
echo 'Файл или папка существует';
Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file():
<?php
$path = 'data.txt';
if(is_file($path))
echo 'Это файл';
elseif(is_dir($path))
echo 'Это папка';
else
echo 'Не найдено';
Проверка прав доступа
Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:
<?php
$path = 'data.txt';
if(is_readable($path))
echo 'Есть права на чтение.';
if(is_writable($path))
echo 'Есть права на запись.';
Копирование, перенос и удаление файла
Для удаления файлов используется функция unlink():
<?php
unlink('data.txt');
Чтобы скопировать файл, используем функцию copy():
<?php
copy('data.txt', 'new_data.txt');
Для переименования и переноса файла в другую папку используется функция rename():
<?php
rename('data.txt', 'new_data.txt');
Работа с файлами с помощью fopen()
Функций file(), file_get_contents() и file_put_contents() достаточно для решения большинства задач, связанных с управлением файлами.
Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.
Итак, открыть (или создать и открыть) файл можно с помощью функции fopen():
<?php
# Если файла нет - он будет создан
$f = fopen('data.txt', 'w');
Функция fopen() возвращает так называемый лескриптор. Это ссылка, указатель на файл, его мы будем передавать в другие функции. Кстати, тип данных этого дескриптора - resource.
Первым параметром мы передаём путь к файлу, вторым - модификатор доступа к файлу. Ниже перечислены наиболее популярные модификаторы:
- r - открытие для чтения, указатель переходит в начало файла.
- r+ - открытие для чтения и записи, указатель переходит в начало файла.
- w - открытие для записи, указатель переходит в начало файла. Если файла нет - создаётся, если есть - очищается от данных.
- w+ - открытие для чтения и записи, в остальном аналогичен w.
- a - открытие для записи, указатель переходит в конец файла. Если файла нет - создаётся.
- a+ - открытие для чтения и записи, в остальном аналогичен a.
- x - создание и открытие для записи, указатель переходит в начало файла. Если файл существует - PHP покажет ошибку.
- x+ - создание и открытие для чтения и записи, в остальном аналогичен x.
Указатель - это нечто вроде курсора. Вы можете переместить его в любое место файла, чтобы добавить или отредактировать определённые данные.
Для записи данных в файл существует функция fwrite(). Давайте попробуем создать файл и записать в него какие-нибудь данные:
<?php
# Если файла нет - создастся, если есть - удалит старые данные
$f = fopen('data.txt', 'w');
# Добавим что-нибудь в файл
fwrite($f, 'Первая запись');
# Добавим что-нибудь ещё
fwrite($f, 'Вторая запись');
# Закроем соединение с файлом
fclose($f);
# Теперь в файле лежит текст "Первая записьВторая запись"
Заметьте, из-за модификатора w при каждом запуске скрипта данные в файле стираются и добавляются заново. Если модификатор заменить на a, данные будут не перезаписываться, а добавляться в конец файла.
Для построчного чтения файла используется функция fgets():
<?php
$f = fopen("data.txt", "r");
while($line = fgets($f, 4096))
echo $line, '<br>';
fclose($f);
При каждом запуске fgets получает следующую строку и возвращает её в $line. Вторым параметром передаётся максимальная длина строки. Это означает, что если строка слишком длинная, она будет обрезана.
Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.