Сразу хорошая новость, в последних версиях 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С Битрикс

Пользовательский тип свойств инфоблока в 1С Битрикс

В дополнение к статье о создании собственного типа пользовательских полей хочу рассказать как делать аналогичные свойства для информационных блоков, т.к. эти свойства относятся к другому модулю, а именно «информационные блоки» (iblock).

Условные операторы в PHP

Условные операторы в PHP

Добрались до логики выполнения программы. И так условные операторы (по другому операторы ветвления) позволяют нам организовать определённое поведение программы в зависимости от входных параметров (данных вводимых пользователем, результатом работы вспомогательных функций). Вся логика в языках программирования основана на Алгебре Буля. 

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

Самые читаемые

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Одним из преимуществ интернет-магазинов на 1С Битрикс на мой взгляд является наличие не так давно до...

Основы SEO оптимизации сайта

Основы SEO оптимизации сайта

Эта статья не истина в последней инстанции, а лишь набор правил которые я применяю при создании/испр...

Собственный тип пользовательских полей в 1С Битрикс

Собственный тип пользовательских полей в 1С Битрикс

Для решения некоторых задач порой не хватает стандартного набора пользовательских полей поставляемых...