Загрузка данных


Работа с файловой системой — это важная часть любого веб-приложения. В 
процессе работы с проектами часто возникает необходимость открыть и обработать 
тот или иной файл для разных задач. 
Всегда соблюдайте осторожность при работе с файлами — вы можете нанести 
большой урон, если сделаете что-то не так. Распространенные ошибки: неправильное 
редактирование файла, случайное удаление важных фрагментов или всего файла. 
При разработке сайта часто приходится прописывать пути к файлам, ссылки на 
документы, страницы. При этом веб-разработчик использует абсолютный и 
относительный пути к файлам. 
Абсолютный путь в PHP 
Абсолютный путь в PHP — это полный путь к директории или файлу в файловой 
системе сервера. 
с:\openserver\domains\php-course\index.php 
Как видно из примера, абсолютный путь — это путь от корня диска до 
конкретного файла или директории. Путь начинается с буквы диска (для ОС 
Windows) или слеша (для ОС UNIX). 
Корневая директория (корневой каталог, корень, root) — это ключевая 
директория компьютера или сервера. С нее начинается файловая система, в ней 
хранятся все остальные подкаталоги, содержащие системные и пользовательские 
файлы. 
Получить абсолютный путь скрипта можно с помощью магической константы
__FILE__: <?php echo __FILE__; 
Для получения абсолютного пути к директории, в которой находится скрипт, есть 
магическая константа __DIR__: <?php echo __DIR__; 
Подключить файл config.php по его абсолютному пути, можно двумя способами: 
267
П Р И М Е Р 1
config.php
<?php
echo "<h1>Привет, я конфигурационный 
файл!</h1>";
echo "<h2>Меня подключили...</h2>";
<?php
// указание пути вручную
// при этом ваш путь может оличаться 
require 'c:/openserver/domains/phpcourse/config.php';
// использование магической константы
require __DIR__ . '/config.php';
?>
Абсолютный путь в URL 
Абсолютный путь в URL означает путь от корня сайта. Корень сайта - содержит 
публичную часть сайта, т.е. доступную извне. 
Корневая директория сайта (корень) — это папка на веб-сервере, в которой 
находятся все файлы ресурса. 
По умолчанию корневая сайта — это сама папка с сайтом, например, php-course. 
Часто корневую меняют на php-course/public (или что-то в этом ключе), делают это 
для предотвращения запуска серверных скриптов по прямой ссылке в браузере. 
Есть несколько способов указать абсолютный путь в URL: 
− http://php-course/about.php - полный путь с протоколом и доменом; 
− //php-course/about.php - полный путь без протокола (протокол берётся из URL 
текущей страницы). Содержит два слеша в начале. 
− /about.php - полный путь без протокола и домена (протокол и домен берутся из 
URL текущей страницы). Содержит слеш в начале. 
Второй и третий варианты удобны тем, что при миграции с http на https или при 
переезде на другой домен все ссылки автоматически сменят протокол и домен, в 
таком случае не нужно будет мониторить и редактировать ссылки вручную. 
Относительный путь в PHP 
У относительных путей в PHP есть один недостаток - они могут строиться 
относительно не той папки, от которой мы ожидаем. 
Когда разработчик подключает скрипт по относительному пути, например: <?php
require('config.php'); он желает (скорее всего) подключить файл config.php, 
расположенный в текущей директории. Но у PHP есть свой алгоритм поиска 
подключаемых файлов: 
− Сначала PHP попытается найти этот файл в папках, указанных в директиве 
include_path конфигурационного файла. Посмотреть, что указано в этой директиве 
можно с помощью var_dump(get_include_path()); - получение текущего значения 
настройки конфигурации include_path. 
− Если мы укажем путь к скрипту в таком виде: require('./config.php'); -
предыдущий шаг будет пропущен. 
268
− Затем PHP попытается найти файл в папке, в которой находится 
подключающий скрипт (см. пример). 
− Далее PHP попытается найти файл в папке текущего рабочего каталога. 
Пример: 
Если в файле текущего каталога подключается файл catalog/index.php, и в самом 
index.php выполняется подключение файла по относительному пути, тогда поиск
подключаемого файла произойдёт и в директории текущего каталога и в директории 
catalog. 
Таким образом, в сложных проектах трудно отследить директорию
запрашиваемого файла. В таких случаях используйте константу __DIR__, что 
автоматически делает путь абсолютным. 
<?php
# можно, но лучше отказаться 
require 'config.php'; 
# вот так хорошо
require __DIR__ . '/config.php';
П Р И М Е Р 2
<?php
// внимательно отследите логику подключения файлов
// разработчик подключает файл index.php из директории catalog
require "catalog/index.php";
// в файле index.php думаем, что подключаем конфигурационный файл базы данных,
// но что-то пошло не так...
?>
Относительный путь в URL 
Относительные пути в URL указываются без слеша в начале ссылки, например: 
<a href="articles">Ссылка</a>
Относительные пути в URL более предсказуемы, чем в PHP, но даже с учетом 
этого, их использование нередко приводит к путанице. Проблема в том, что при 
каждом клике по этой ссылке текущий URL будет не перезаписываться, а 
дополняться.
Открытие, закрытие файла 
Для открытия файлов в PHP определена функция fopen(). Функция открывает 
локальный или удаленный файл и возвращает указатель на него. Указатель 
используется во всех операциях с содержимым файла. 
fopen 
Функция fopen() — открывает файл или URL. 
269
Общий вид тега:
fopen($filename, $mode);
Закрепляет именованный ресурс, указанный в аргументе filename, за потоком. 
Параметры:
− filename – имя файла. 
− mode – режим открытия. 
Список некоторых режимов открытия 
r Чтение. Указатель файла устанавливается на его начало
r+ Чтение и запись. Указатель файла устанавливается на его начало
w
Запись. Указатель файла устанавливается на его начало. Все старое содержимое 
файла теряется. Если файл с указанным именем не существует, функция пытается 
его создать
w+
Чтение и запись. Указатель файла устанавливается на его начало. Все старое 
содержимое файла теряется. Если файл с указанным именем не существует, 
функция пытается его создать
a
Запись. Указатель файла устанавливается на его конец. Если файл с указанным 
именем не существует, функция пытается его создать
a+ Чтение и запись. Указатель файла устанавливается на его конец. Если файл с 
указанным именем не существует, функция пытается его создать
* - полный список режимов смотрите в открытых источниках
$fp = fopen("myfile.txt", "r"); // для чтения 
$fp = fopen("myfile.txt", "w"); // для записи 
$fp = fopen("myfile.txt", "a"); // для добавления в конец 
Возвращаемые значения: возвращает указатель на файл (дескриптор) в случае 
успешного выполнения или false в случае возникновения ошибки. Если открыть файл 
не удалось, то можно прервать выполнение программы с выводом соответствующего 
сообщения. 
Например: 
// $fp - дескриптор
// имя $fp от file pointer
$fp = fopen( "myfile.txt", "w" ) or die ( "Не удалось открыть файл" ); 
После окончания работы файл надо закрыть с помощью функции fclose(), которая 
принимает в качестве параметра дескриптор файла. 
fclose 
Функция fclose() — закрывает открытый дескриптор файла. 
Общий вид тега:
fclose($stream); 
Функция закрывает файл, на который указывает дескриптор stream. 
270
Параметр:
− stream – дескриптор. Должен быть корректным и указывать на файл, открытый 
ранее с помощью функции fopen(). 
Возвращаемые значения: возвращает true в случае успешного выполнения или 
false в случае возникновения ошибки. 
П Р И М Е Р 3
<?php
if ($fp = @fopen("garik.txt", "r")) {
echo "Файл открыт для чтения (режим - r)";
// тут будет выполняться какое-то действие с файлом
// в конце работы закрыть файл
fclose($fp);
} else {
echo "Файл не существует";
};
?>
Чтение файла 
Для построчного чтения используется функция fgets(), которая получает 
дескриптор файла и возвращает одну считанную строку. 
fgets 
Функция fgets() — читает строку из файла. 
Общий вид тега:
fgets($stream, $length);
Читает строку из файлового указателя. 
Параметры:
− stream - указатель на файл. Должен быть корректным и указывать на файл, 
успешно открытый функцией fopen(). 
− length - необязательный параметр. Позволяет указать максимальный размер 
строки в байтах. Чтение заканчивается при достижении length - 1 байт, либо если 
встретилась новая строка (которая включается в возвращаемый результат) или конец 
файла (в зависимости от того, что наступит раньше). Если длина не указана, чтение 
из потока будет продолжаться до тех пор, пока не достигнет конца строки. 
Возвращаемые значения: возвращает строку размером в length - 1 байт, 
прочитанную из дескриптора файла. Если данных для чтения больше нет, то 
возвращает false. 
В случае возникновения ошибки возвращает false. 
271
П Р И М Е Р 4
<?php
if ($fp = @fopen("garik.txt", "r")) {
// считаем строку из файла
$data = fgets($fp);
var_dump($data);
fclose($fp);
} else {
echo "Файл не существует";
};
?>
В случае необходимости считать из файла не строку целиком, а определенное 
количество байт (символов). 
П Р И М Е Р 5
<?php
if ($fp = @fopen("garik.txt", "r")) {
// garik.txt файл в кодировке utf
// набор символов - кириллица (1 символ - 2 байта)
// таким образом (см. параметр length): 
// будет считано 7 - 1 = 6 байт (3 символа)
$data = fgets($fp, 7);
echo $data;
fclose($fp);
} else {
echo "Файл не существует";
};
?>
Используя цикл while пройдем построчно по всему файлу. 
П Р И М Е Р 6
<?php
if ($fp = @fopen("garik.txt", "r")) {
// считаем построчно весь файл
while ($data = fgets($fp)) {
echo $data, "<br />";
};
fclose($fp);
} else {
echo "Файл не существует";
};
?>
Чтобы проследить окончание файла, можно использовать функцию feof(), которая 
возвращает true при завершении файла. И пока не будет достигнут конец файла, мы 
можем применять функцию fgets(). 
feof 
Функция feof() – проверяет, достигнут ли конец файла.
272
Общий вид тега:
feof($stream);
Проверяет, достигнут ли конец файла. 
Параметр: 
− stream - указатель на файл должен быть корректным и указывать на файл, 
успешно открытый функцией fopen() и не закрытый функцией fclose(). 
Возвращаемые значения: возвращает true, если указатель файла указывает на 
EOF (конец файла) или произошла ошибка, иначе возвращает false. 
Используя цикл while пройдем посимвольно (length = 3) по всему файлу.
П Р И М Е Р 7
<?php
if ($fp = @fopen("garik.txt", "r")) {
// будем считывать символы, пока не конец файла 
while (!feof($fp)) {
$data = fgets($fp, 3);
echo $data;
};
fclose($fp);
} else {
echo "Файл не существует";
};
?>
Также можно провести поблочное считывание, то есть считывать определенное 
количество байт из файла с помощью функции fread(). 
fread 
Функция fread() — выполняет бинарно-безопасное чтение файла.
Общий вид тега:
fread($stream, $length);
fread() читает до length байт из файлового указателя stream и смещает указатель. 
Чтение останавливается, как только было достигнуто одно из следующих условий: 
− было прочитано length байт, 
− достигнут EOF (конец файла), 
− стал доступен пакет или истекло время ожидания сокета (для сетевых потоков) 
− если читаемый поток является буферизованным и не представляет собой 
обычный файл, то за один раз максимум читается количество байт, равное размеру 
одной порции данных (обычно это 8192), однако, в зависимости от ранее 
буферизованных данных размер возвращаемых данных может быть больше размера 
одной порции данных. 
273
Параметры:
− stream -указатель на файл, обычно создаваемый с помощью функции fopen(). 
− length - указывает размер прочитанных данных в байтах. 
Возвращаемые значения: возвращает прочтённую строку или false в случае 
возникновения ошибки. 
В следующем примере текстовый файл для чтения сохранен в национальной
кодировке. Таким образом, кодировку полученного набора символов 
предварительно необходимо конвертировать. 
П Р И М Е Р 8
<?php
if ($fp = @fopen("garikansi.txt", "r")) {
// garikansi.txt файл в кодировке ansi
while ($data = fread($fp, 10)) { 
// а если ansi - то русские символы для вывода необходимо конвертировать 
$data = iconv("Windows-1251", "UTF-8", $data);
echo $data;
};
fclose($fp);
} else {
echo "Файл не существует";
};
?>
iconv 
Функция iconv() – преобразует строку из одной кодировки символов в другую. 
Общий вид тега:
iconv($from_encoding, $to_encoding, $string);
Преобразует string из from_encoding в to_encoding. 
Параметры:
− from_encoding – текущая кодировка, используемая для интерпретации string.
− to_encoding – желаемая кодировка результата.
− string – строка для преобразования.
Возвращаемые значения: возвращает преобразованную строку или false в случае 
ошибки. 
filesize 
Функция filesize() — возвращает размер файла. 
Общий вид тега:
filesize($filename);
Возвращает размер указанного файла. 
274
Параметр:
− filename - путь к файлу.
Возвращаемые значения: возвращает размер указанного файла в байтах или 
false (и генерирует ошибку уровня E_WARNING) в случае возникновения ошибки. 
П Р И М Е Р 9
<?php
$fp = @fopen("garik.txt", "r");
while (!feof($fp)) { 
$data = fgets($fp);
echo $data, "<br />";
};
fclose($fp); 
echo "<p>Размер файла - " . filesize("garik.txt"), " байт.";
?>
Если надо прочитать файл полностью, то можно применить одну из функций 
чтения файла целиком. При этом нам не надо открывать явно файл, получать
дескриптор, а затем закрывать файл. 
readfile 
Функция readfile () — выполняет чтение файла и записи его в выходной буфер. 
Общий вид тега:
readfile($filename);
Читает файл и записывает его в буфер вывода. 
Параметр:
− filename - имя читаемого файла. 
Возвращаемые значения: функция возвращает количество прочитанных из 
файла байт в случае успешного выполнения, или false в случае возникновения 
ошибки. 
П Р И М Е Р 1 0
<?php
echo "<h3>";
// функция readfile()
// 1. выводит содержимое файла в браузер
// 2. возвращает размер файла
$size = readfile("citate.txt");
echo "</h3>Размер файла citate.txt - ", $size , " байт";
?>
file_get_contents 
Функция file_get_contents() — читает содержимое файла в строку. 
275
Общий вид тега:
file_get_contents($filename, $use_include_path, $context, $offset, $length);
Функция возвращает содержимое файла в строке, начиная с указанного смещения 
offset и до length байт. 
Параметры:
− filename - путь к файлу.
− use_include_path – (по умолчанию - false) для поиска файла в директории include
path конфигурационного файла (чаще всего не используется). 
− context – (по умолчанию - null) ресурс контекста, созданный с помощью 
функции stream_context_create().
− offset – смещение, с которого начнётся чтение оригинального потока. 
Отрицательное значение смещения будет отсчитываться с конца потока. Поиск 
смещения (offset) не поддерживается при работе с удалёнными файлами.
− length – максимальный размер читаемых данных. По умолчанию чтение 
осуществляется пока не будет достигнут конец файла.
Возвращаемые значения: функция возвращает содержимое файла в строке или 
false в случае возникновения ошибки. 
Ошибки: будет сгенерирована ошибка уровня E_WARNING в случаях, если не 
удастся найти filename, задан length меньше нуля, или поиск по смещению offset в 
потоке завершится неудачно. 
П Р И М Е Р 1 1
<?php
// получаем в пременную содержимое файла целиком
$citate = file_get_contents('citate.txt');
echo $citate;
?>
Использование функции file_get_contents() наиболее предпочтительно в случае 
необходимости получить содержимое файла целиком. Следующий пример 
демонстрирует практику применения функции. Алгоритм выполняемых действий, 
следующий: 
− чтение файла формата JSON целиком; 
− преобразование полученной JSON-строки в ассоциативный массив PHP; 
− создание массива с данными о новой группе; 
− добавление данных нового массива в массив групп; 
− вывод массива обновленных данных о группах. 
Важно. Внимательно изучите логику и код примера 12 в раздаточном материале. 
На основе примера будут выполняться самостоятельные и практические работы по 
хранению взаимосвязанных данных в текстовых файлах. 
276
file 
Функция file() — читает содержимое файла и помещает его в массив. 
Общий вид тега:
file($filename [, $flags=0, $context]);
Читает содержимое файла и помещает его в массив. 
Параметры: 
− filename - путь к файлу. 
− flags - в качестве необязательного параметра flags может можно указать одну 
или более следующих констант: 
✓ FILE_USE_INCLUDE_PATH - искать файл в include_path.
✓ FILE_IGNORE_NEW_LINES - пропускать новую строку в конце каждого 
элемента массива.
✓ FILE_SKIP_EMPTY_LINES - пропускать пустые строки.
− context – (по умолчанию - null) ресурс контекста, созданный с помощью 
функции stream_context_create(). 
Возвращаемые значения: возвращает файл в виде массива. Каждый элемент 
массива соответствует строке файла, с символами новой строки включительно. В 
случае ошибки возвращает false. 
П Р И М Е Р 1 3
<?php
// целевой файл в национальной кодировке cp1251
$file = 'garik.txt';
// чтение файла в массив
$arr = file($file, FILE_IGNORE_NEW_LINES);
// функция iconv требует параметр - строку
// поэтому массив $arr преобразуем в строку
// в качестве разделителя - перенос строки (для читаемого вывода)
$str = iconv("Windows-1251", "utf-8", implode("\n", $arr));
// преобразуем строку обратно в массив
$arr = explode("\n", $str);
// вывод строки
echo "<pre>";
print_r($str);
// вывод массива
echo "<pre>";
print_r($arr);
?>
277
З А Д А Н И Е 1
В директории раздаточного материала (Программирование в PHP – Раздаточный 
материал – Практическая работа №29 – Задание №1) вам предложен файл team.json. 
Файл получен автоматическим экспортом строк таблицы team базы данных db_music 
в JSON-объект. 
Напишите скрипт, получающий содержимое файла. Декодируйте JSON в 
ассоциативный массив PHP. Для получения ассоциативного массива используйте 
второй аргумент функции json_decode: json_decode($json, true); 
Выведите в браузер и изучите структуру массива. Отделите служебную от 
полезной информации массива. Передайте в строке запроса GET-параметром
идентификатор строки массива (таблицы) team для вывода в браузер. 
Используя функцию print_r() выведите запрошенную запись. 
З А Д А Н И Е 2
В директории раздаточного материала (Программирование в PHP – Раздаточный 
материал – Практическая работа №29 – Задание №2) вам предложен файл album.json, 
содержащий массив данных об альбомах, записанный в формате JSON-объекта. 
Создайте форму добавления записи нового альбома. 
<form action="server.php?id=7" method="post">
Название: <input type="text" value=""><p>
Псевдоним: <input type="text" value=""><p>
Страна: <input type="text" value="Россия"><p>
Описание: <input type="text" value=""><p>
Год выхода: <input type="text" value=""><p>
Примечание: <input type="text" value=""><p>
<input type='submit'>
</form>
ПРАКТИЧЕСКИЕ ЗАДАНИЯ
278
Обратите внимание! Для установления принадлежности добавляемого альбома 
группе в параметр action формы добавлен GET-параметр, указывающий 
идентификатор родительской записи группы. 
Передайте данные формы на условный сервер. В сценарии сервера выполните 
следующие действия: 
− Извлеките JSON-данные файла album.json. 
− Добавьте в массив альбомов полученные данные формы. 
− Выведите обновленные данные массива альбомов в браузер. 
Примерный формат вывода обновленного массива продемонстрирован на 
рисунке. 
З А Д А Н И Е 3
В директории раздаточного материала (Программирование в PHP – Раздаточный 
материал – Практическая работа №29 – Задание №3) вам предложен файл album.json. 
Напишите сценарий, загружающий в форму запись массива альбомов для 
редактирования. 
Идентификатор редактируемой записи массива передайте с помощью GETпараметра. Примерный формат вывода формы представлен на рисунке