Сразу хорошая новость, в последних версиях PHP научился автоматически преобразовывать символ / «слеш» в пути к файлу в нужную сторону в зависимости от вашей операционной системы (Windows или UNIX), более того, распознавая в пути к файлу строки http:// или ftp:// PHP понимает что на самом деле ему нужно установить сетевое соединение и работать с ним а не с локально расположенным файлом. При этом в рамках программы такой «сетевой» файл ничем не отличается от обычного и если у вас есть соответствующие права, то вы можете и читать и записывать http и ftp файлы.

Открытие файла

Т.к. PHP написан на языке C (читается как «Си»), в нём как и в Си, работа с файлами разделена на 3 этапа:

  1. Открытие файла
  2. Чтение/Запись
  3. Закрытие файла

В начале файл открывается в нужном режиме чтения, при этом возвращается целое число, идентификатор открытого файла или дескриптор файла. Затем выполняются команды связанные с чтением или записью в файл, при этом эти команды ориентируются уже на полученный дескриптор файла а не на его имя. После выполнения нужных команд, файл лучше всего закрыть. Конечно PHP закроет все файлы автоматически после завершения сценария, однако если ваш файл долго обрабатывается, то может происходить утечка ресурсов.


Для открытия файла в PHP используется функция fopen(), общий вид функции:


fopen( string $filename , string $mode);

Функция принимает 2 базовых параметра это

  • $filename — имя файла (путь к файлу)
  • $mode — режим чтения файла

В зависимости от режима открытия файла вы можете выполнять те или иные операции над файлом, ниже приведена таблица с описанием режимов чтения:


Режим Чтение Запись Файловый указатель Очистка файла Создать, если файла нет Ошибка, если файл есть
r Да Нет В начале Нет Нет Нет
r+ Да Да В начале Нет Нет Нет
w Нет Да В начале Да Да Нет
w+ Да Да В начале Да Да Нет
a Нет Да В конце Нет Да Нет
a+ Да Да В конце Нет Да Нет
x Нет Да В начале Нет Да Да
x+ Да Да В начале Нет Да Да
c Нет Да В начале Нет Да Нет
c+ Да Да В начале Нет Да Нет

Однако это не полный список режимов чтения файла. Дело в том, что в конце любой из строк обозначающих режим открытия файла (r, w, a и т.п.) можно добавить ещё один необязательный символ b или t .
  • b — файл открывается в режиме бинарного чтения/записи
  • t — файл открывается в режиме трансляции символа перевода строки (символы \n для UNIX или \r\n для Windows) и файл воспринимается как текстовый

Рассмотрим пару примеров:


//Открытие файла на чтение
$f = fopen('home/www/file.txt', 'rt');

//Открытие HTTP-соединения на чтение
$f = fopen('https://it-svalka.ru/', 'rt');

//Открытие FTP соединения
$f = fopen('ftp://user:password@example.com/log.txt', 'wt');

Запись и закрытие

Запись в файл осуществляется функцией fwrite() которая принимает 2 аргументам, указатель на файл и строку которую нужно записать в файл. Пример:


//Открытие тестового файла
$file = fopen('test.txt', 'wt');
//Запись строки в файл
fwrite($file, 'Текущая дата и время: ' . date('d.m.y H:i:s'));
//Закрытие файла
fclose($file);

В результате выполнения кода, будет создан файл (если его нет) test.txt и запишется строка, в моём случае:

Текущая дата и время: 10.09.20 14:35:46


Как видите после записи я вызываю функцию fclose() куда передаю дескриптор файла для его закрытия. Давайте рассмотрим несколько практических задач которые могут встретиться вам в реальных проектах.

Логирование данных

Одной из частых задач связанных с чтением/записью фалов, является логирование данных о работе веб-сайта. Логировать можно всё что угодно, ошибки, результаты запросов к БД, активность пользователей и т.п.


//Адрес файла с логами храним в константе
define('LOG_FILE', 'log.txt');

/**
 * Функция записи лога
 * @param $textToLog
 */
function logFile($textToLog){
    //Открытие файла лога
    $file = fopen(LOG_FILE, 'at');
    $sepatrator = '-----------------------------------------------';
    //Запись строки в файл
    fwrite($file, "\n" . $sepatrator . "\n". $textToLog . "\nдата и время записи: " . date('d.m.y H:i:s') . "\n");
    //Закрытие файла
    fclose($file);
}

//Вызов функции
logFile('Пользователь открыл страницу');

В результате обращения к этому скрипту, в файл log.txt попадут следующие данные:

-----------------------------------------------
Пользователь открыл страницу
дата и время записи: 10.09.20 14:52:35

-----------------------------------------------
Пользователь открыл страницу
дата и время записи: 10.09.20 14:52:37

Обратите внимание на двойные кавычки вместо одинарных. Это нужно для того, чтобы PHP корретно интерпретировал сочетание «\n» как символ переноса строки. Функцию logFile() можно улучшать до бесконечности, добавляя различные дополнительные данные из сессии пользователя, данных запроса, данных о сервере и т.п.

Парсинг

Ещё дна частая задача в веб-программировании, это парсинг файлов. Иногда вам нужно слить сайт конкурента чтобы проанализировать цены на похожие товары, загрузить данные с csv документа в базу данных, проанализировать xml карты сайта и т.д. Давайте рассмотрим загрузку данных их csv документа.


//Открываем csv файл в режиме чтения
$csv = fopen('clients.csv', 'r');

//Читаем файл построчно при помощи fgetcsv()
while ($row = fgetcsv($csv, 1000, ';')){
    //Здесь можно выполнять запросы к БД для сохранения данных пользователей и т.п.
    echo '<pre>'; print_r($row); echo '</pre>';
}

//Закрываем файл
fclose($csv);

Я создал csv сохранив его в кодировке UTF-8, разделитель поля — ; разделитель текста — «. Обратите внимание что в функции fgetcsv() третий параметр (разделитель) должен совпадать с тем, что вы указывали при сохранении csv.


В результате выполнения скрипта, получаю содержимое csv вот в таком виде:


Array
(
    [0] => ФИО
    [1] => Email
    [2] => Телефон
)
Array
(
    [0] => Иванов Иван Иванович
    [1] => ivanov@mail.ru
    [2] => +79001234567
)
Array
(
    [0] => Петров Пётр Петрович
    [1] => petrov@gmail.com
    [2] => +79280001122
)

Более подробно вопросы парсинга данных (как excel документов так и html страниц я рассмотрю в отдельных прикладных статьях). Желаю удачи в изучении php!

Полезная статья?
(Голосов: 1, Рейтинг: 3.3)
Вам также могут понравиться
Английский для программистов

Английский для программистов

Почему IT-специалисту необходимо освоить английский язык? Разбираем в статье.

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как правильно подключать стили и скрипты к шаблону 1С Битрикс.

Генерация оглавления статьи

Генерация оглавления статьи

В статье рассмотрен пример функции для генерации оглавления статьи блога или новости


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке