Урок 18. PHP — Файлы

А сейчас будет достаточно большой, но не сложный урок о работе с файлами в php. Для начала, для чего нужны файлы? Ведь можно все хранить в базе данных MySQL или PostgreSQL или любой другой. Но иногда бывают такие задачи, когда использование БД, со всеми обработками и заботой о безопасности соединения, не целесообразно. Например нужно сделать обычный счетчик, а до этого в проекте у нас БД не использовалась. Так что нам, ради одного малюсенького счетчика заводить базу данных и хранить в ней всего пару строк? тут гораздо проще воспользоваться файлами. К тому же, иногда на хостинге вообще нет поддержки баз данных, тогда файлы вообще остаются единственным выходом.

Ну, допустим я вас убедил, что файлы необходимы :) Теперь давайте разбираться, как же с ними работать. Как создавать, открывать, записывать, перезаписывать, читать и так далее. Обо всем по порядку.

Создаем файл

В PHP для открытия файлов используется функция fopen. Тем не менее, она также может и создавать файлы. Если передать fopen имя файла, которого не существует, то она создаст его.

Сама функция fopen принимает два параметра, оба они обязательны. Во-первых, мы должны указать имя файла, который хотим открыть. Во-вторых, передать параметр, который объясняет функции, что мы планируем делать с этим файлом (например, чтение из файла, запись и так далее).

Если нужно создать файл, то указываем его имя и передаем параметр, что мы хотим записать в него данные. Обратите внимание: Мы должны обязательно сказать PHP, что мы пишем в файл, в противном случае она не будет создавать новый файл.
Пример:

$ourFileName = "testFile.txt";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fclose($ourFileHandle);

Первая строчка $ourFileName = testFile.txt создает строковую переменную, в которой мы будем хранить имя файла.
Вторая строчка $ourFileHandle = fopen($ourFileName, ‘w’) or die(«can’t open file») соответственно создает или открывает уже существующий файл на запись. Или же возвращает сообщение, что не может открыть файл.
Третья строчка fclose($ourFileHandle) закрывает файл. На самом деле все просто.

Параметры открытия файла в php

  • Первый параметр ‘r’ (read) — открывает файл только на чтение, записывать в него будет нельзя.
  • Второй параметр ‘w’ (write) — открывает для записи. При этом всегда запись будет идти с начала файла. Если там уже есть какая то информация — то она будет перезаписана.
  • Третий параметр ‘a’ (append) — открывает файл на запись, но при этом будет дописывать в конец файла, в отличие от w.

Расширенные параметры:

  • Параметр ‘r+’ — открывает и на чтение и на запись. Указатель будет в начале файла.
  • Параметр ‘w+’ — открывает и на чтение и на запись, НО удаляет всю информацию, которая была в файле!!!
  • араметр ‘a+’ — открывает на чтение и запись, но указатель будет в конце файла.

Естественно, что функции можно передать только один из этих параметров, а не несколько. Их нужно подставлять вместо ‘X’:

fopen($ourFileName, 'X')

Запись в файл

Ну, вот мы открыли файл, подобрали нужный нам параметр, что же дальше? Нужно в него что-то записать. Как это сделать? С помощью функции fwrite, которая принимает в качестве параметров указатель на файл и строку текста, которую хотим записать. Пример:

$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = "Первая строчка\n";
fwrite($fh, $stringData);
$stringData = "Вторая строчка\n";
fwrite($fh, $stringData);
fclose($fh);

Создали файл testFile.txt, указатель на него хранится в переменной $fn. Записали в него строчку «Первая строчка» (в конце применили символ конца строки \n), а затем и «Вторая строчка». После чего закрыли файл.

ВНИМАНИЕ! Никогда не забывайте закрывать ваши файлы! Иначе в случае аварийного завершения выполнения скрипта — данные в файлах не сохранятся! Всегда после работы используйте fclose!!!

Чтение из файла

Записать записали, теперь давайте прочитаем! Это тоже не так сложно. Используем функцию fread. На вход ей подаем указатель на файл и количество байт, которое хотим прочитать. Например, один символ равен одному байту (зависит от кодировки), мы хотим прочитать 5 символов: $theData = fread($fh, 5).
Но если нужно получить всю информацию, которая есть в файле, то тут нам понадобится функция filesize, которая возвращает количество байт в файле, следовательно, если результат функции filesize передать в fread, то мы получим полностью всю информацию из файла:

$myFile = "testFile.txt";
$fh = fopen($myFile, 'r');
$theData = fread($fh, filesize($myFile));
fclose($fh);
echo $theData;

Надеюсь понятно объяснил.
Иногда же полезно читать файл построчно, а не по количеству байт. Для этого вместо fread нужно просто использовать fgets:

$myFile = "testFile.txt";
$fh = fopen($myFile, 'r');
$theData = fgets($fh);
fclose($fh);
echo $theData;

В результате получим первую строчку из файла testFile.txt. Соответственно, чтобы пройтись по всем строчкам нужно использовать цикл foreach:

<?php
    $lines = file('testFile.txt');
    foreach($lines as $single_line)
        echo $single_line . "<br />\n";
?>

Теперь вы научились открывать файлы на чтение, запись или на то и другое. Записывать в них данные или же дописывать сверху, с помощью Append, а также читать из них информацию.

htmlentities | Содержание | str_replace

Комментарии:

  1. Stas — 24.08.2013 01:55

    я нихера не понял! Ты можеш обьяснить каждый елемент отдельно??? Бля раз уж взялся за дело так доведи его до конца!! И без ошибок!! Ты ведь не для професионалов пишеш!!

  2. myblaze 25.08.2013 07:10

    Поспокойнее можно как то, я таки старался и бесплатно писал это, а с таким отношением нет желания даже что то уточнять…

  3. Stas — 25.08.2013 13:07

    Ну да извени. Но всетаки новичкам тяжело разбирать самим, как например мне в инете один ты норм статью написал, недообьяснил но написал внятно хоть и с ошибками)

  4. Stanislav — 20.09.2013 23:48

    Warning: fread() expects
    exactly 2 parameters, 1 given
    in /home/u244049734/
    public_html/index.php on line
    4

  5. Stanislav — 20.09.2013 23:49

    php
    $myfile=»html.txt»;
    $fh=fopen($myfile, ‘r’);
    $thedata=fread($fh, fgets($fh));
    fclose($fh);
    echo $thedata

  6. Farhad — 31.01.2014 12:34

    на практике попробывал все работает.
    Большое спасибо автору!

  7. Yuriy — 04.04.2014 15:25

    Иногда же полезно читать файл построчно, а не по количеству байт. Для этого вместо fread нужно просто использовать fgets:

    $myFile = «testFile.txt»;
    $fh = fopen($myFile, ‘r’);
    $theData = fgets($fh);
    fclose($fh);
    echo $theData;
    В результате получим первую строчку из файла testFile.txt

    Как в данном случае прочитать !только последнюю строчку, если запись была осуществлена с помощью ключа ‘а’?

  8. Yuriy — 04.04.2014 15:41

    Да, уточню. Я веду, например, лог посещений пользователем.
    записываю в файл информацию о его визитах, а именно: дату и время.
    Для себя хочу выводить информацию из файлов логов пользователей кто и когда был последний раз, но при этом не терять предыдущие записи, по этому ключ ‘а’.
    Заранее спасибо за пояснение :)

  9. Vadim — 05.05.2014 12:52

    Спасибо за уроки. Мне как уже знающему несколько ЯП очень ясно всё, буквально за пару часов прошёл.

  10. Алексей — 26.07.2015 15:36

    Всё тут понятно прекрасно, только вот \n не перекидывает на новую строку почему-то, что с\n, что без лепит в одну строку и всё…

  11. Іван — 04.08.2015 12:49

    $myFile = «testFile.txt»;
    $fh = fopen($myFile, ‘r’);
    $theData = fgets($fh);
    fclose($fh);
    echo $theData;

    На етот код сервер реагирует так:
    Warning: fopen(testFile.txt): failed to open stream: No such file or directory in /home/u976569827/public_html/index.php on line 15

    Warning: fgets() expects parameter 1 to be resource, boolean given in /home/u976569827/public_html/index.php on line 16

    Warning: fclose() expects parameter 1 to be resource, boolean given in /home/u976569827/public_html/index.php on line 17

  12. ALEX188ALEX — 05.11.2015 01:01

    Прекрасно всё изложено. «Освежил»в своей памяти кое-какие моменты. По сравнении с доками-здесь изложено всё очень интересно, основное. Автору статей могу пожелать не останавливаться на достигнутом, а продолжать работать над статьями. Таким образом, изложить «понятным языком» без «сухих терминов» документацию.

  13. Дмитрий — 21.06.2016 12:46

    Здесь автор не уточнил ничего о функции из вот этой строчки:
    «$lines = file(‘testFile.txt’);». О функции file(). Она читает файл и помещает информацию из него в массив, остальное в интернете.)

  14. дима — 16.07.2016 08:39

    $stringData = «Вторая строчка\n»;
    Символ переноса строк не работает в двойных кавычках

  15. Антон — 27.09.2016 10:47

    теперь следует писать так: «Вторая строчка\r\n»
    Тогда всё работает как надо

  16. Максим — 21.08.2019 18:00

    Мне 13 лет, и я почти все понял с 3 раза, огромное спасибо автору за то что он пишет такие полезные статьи) Но лучше бы если в каком-либо коде ты используешь какуя-то команду лучше сразу её объяснять, что не до конца понятно. Ещё раз спасибо автору)

  17. MUHAMMED — 17.11.2019 13:45

    Классно обяснил все понятно.

  18. влад — 02.05.2020 15:17

    Подскажите как сделать это задание желательно со скринами кодов:
    Создайте форму в которой будут следующие элементы:
    • Содержание файла – data;
    • Название файла – name;
    • Кнопка отправки.
    При отправке форма должна будет отослать POST запрос файлу 18_1.php, который получит данные из запроса и сохранит их в файл с именем также полученным из запроса.

Добавить комментарий