Сохранение переменной в файл php. Чтение и запись файлов
PHP - Работа с файлами
Правильно работать с файлами должен уметь каждый программист. Данная статья ориентирована на начинающих PHP программистов, однако «сборник рецептов» будет полезен и продвинутым пользователям.
Работа с файлами разделяется на 3 этапа:
- Открытие файла.
- Манипуляции с данными.
- Закрытие файла.
I. Открытие файла
Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными параметрами этой функции является имя файла и режим файла.
Согласно документации PHP выделяют следующие виды режимов файлов:
- r – открытие файла только для чтения.
- r+ - открытие файла одновременно на чтение и запись.
- w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
- w+ - аналогичен r+, только если на момент вызова файла такой существует, его содержимое удаляется.
- a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
- a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.
Примечание: в конце любой из строк может существовать еще один необязательный параметр: b или t. Если указан b, то файл открывается в режиме бинарного чтения/записи. Если же t, то для файла устанавливается режим трансляции перевода строки, т.е. он воспринимается как текстовый.
Для демонстрации рассмотрим следующий сценарий:
//Открывает файл в разных режимах
$fp = fopen("counter.txt", "r"); // Бинарный режим
$fp = fopen("counter.txt", "rt"); // Текстовый режим
$fp = fopen("http://www.yandex.ru", "r");// Открывает HTTP соединение на чтение
$fp = fopen("ftp://user:[email protected]", "w"); //Открываем FTP соединение с указанием логина и пароля
?>
II. Манипуляции с данными файла
Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:
$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
If ($test)
Echo "Данные в файл успешно занесены.";
Else
Echo "Ошибка при записи в файл.";
Fclose($fp); //Закрытие файла
?>
Для построчного считывания файла используют функцию fgets(). Функция принимает 2 обязательных параметра:
If ($fp)
{
While (!feof($fp))
{
$mytext = fgets($fp, 999);
Echo $mytext."
";
}
}
Else
Fclose($fp);
?>
Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).
Echo readfile("counter.txt");
?>
Также можно использовать функцию fpassthru() которая принимает 1 обязательный параметр. Перед использованием этой функции необходимо открыть файл в режиме чтения. По окончанию считывания файла функция автоматически закрывает файл(при этом дескриптор файла становиться недействительным).
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
If ($fp)
Echo fpassthru($fp);
Else
Echo "Ошибка при открытии файла";
?>
Очень часто встречаются ситуации, когда необходимо содержимое сайта считать в массив. Эту возможность предусматривает использование функции file(). При вызове этой функции, каждая строка файла сохранятся в отдельном элементе указанного массива.
Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к. она не является безопасной в плане считывания двоичных файлов, если при этом, где-то встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного файла.
$file_array = file("counter.txt"); // Считывание файла в массив $file_array
//
// Работа с данными массива
//
?>
Примечание: Работа с массивами подробно описывается здесь, авторы: Мухаметшин Д.Ф., Симдянов И.В.
В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.
авайте представим ситуацию, когда файл необходимо считать по символам. Для этого мы можем воспользоваться функцией fgetc(). Функция принимает единственный параметр. Функция полезна если нам необходимо найти какой-либо символ или количество одинаковых символов.
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
If ($fp)
{
While(!feof($fp))
{
$char = fgetc($fp);
If ($char == "с")
$i = $i + 1;// Находим символ «с»
}
Echo "Количество букв "c" в файле: ". $i;
}
Else echo "Ошибка при открытии файла";
?>
III. Закрытие файла
Закрытие файла происходить с помощью функции fclose(), которая принимает 1 обязательный параметр.
$fp = fopen("counter.txt", "r");
If ($fp)
{
Echo "Файл открыт";
Fclose($fp); // Закрытие файла
}
?>
Сборник рецептов
1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся функцией file_exists().
myfile("counter.txt"); // Используем функцию myfile, передав в качестве аргумента имя файла
function myfile($name) //Создаем функцию для проверки существования файла
If (file_exists($name)) echo "Файл существует";
?>
Примечание: Функция file_exists не производит проверку файлов на удаленном веб-сервере. Для правильной работы функции, файл со скриптом должен находиться на том сервере, где и проверяемый файл.
2) Определяем размер файла с помощью функции filesize()
myfile("counter.txt");
//Создаем функцию для проверки существования файла и определения размера файла
function myfile($name)
If (file_exists($name)) echo "Размер файла: ".filesize($name)." байт";
Else echo "Файл не существует";
?>
3) Создание временного файла с помощью функции tmpfile()
$myfile = tmpfile();
// Записываем во временный файл
Fwrite($myfile, "Эта строка записывается во временный файл.");
Fseek($myfile, 0); // Устанавливаем указатель файла
Echo fread($myfile, 1024); // выводим содержимое файла
?>
4) Вам необходимо определить количество строк в файле. Для этого используем функцию count()
$fp = file("counter.txt");
Echo "Количество строк в файле: ".count($fp);
?>
5) Нам необходимо использовать механизм блокировки файла
$fp = fopen("counter.txt", "a");
Flock($fp, LOCK_EX); // Блокирование файла для записи
Fwrite($fp, "Строка для записи");
Flock($fp, LOCK_UN); // Снятие блокировки
Fclose($fp);
?>
6) Нам необходимо удалить определенную строку из файла
$num_stroka = 5; //Удалим 5 строку из файла
$file = file("counter.txt"); // Считываем весь файл в массив
For($i = 0; $i < sizeof($file); $i++)
If($i == $num_stroka) unset($file[$i]);
$fp = fopen("counter.txt", "w");
Fputs($fp, implode("", $file));
Fclose($fp);
?>
7) Определение типа файла. Используем функцию filetype(), которая принимает единственный параметр
$mytype = filetype("counter.txt");
Echo "Тип файла: ".$mytype;
?>
После вызова строка может содержат одно из следующих значений:
file – обычный файл
dir – каталог
fifo – fifo-канал
block – блочно - ориентированное устройство
char – символьно - ориентированное устройство
unknown – неизвестный тип файла
8) Если вы хотите просмотреть все параметры файла, то следует воспользоваться функцией stat()
$filename = stat("counter.txt");
Echo "
";";Print_r($filename);
Echo "
?>
9) Нам необходимо очистить файл, используем функцию ftruncate()
$fp = fopen("counter.txt", "a"); //Открываем файл в режиме записи
Ftruncate($fp, 0) // очищаем файл
?>
10) Нам необходимо узнать дату последнего изменения файла, используем функцию filectime(). Функция возвращает значение времени в форме Unix timestamp.
Echo filectime("counter.txt");
В PHP часто приходится иметь дело с созданием файла...все очень просто нет файла на диске, код прогнался и файл появился, далее можно считать этот файл в другую переменную или даже любую страницу в интернете и потом что-нибудь туда записать...но для этого надо знать спец функции...об этом в этой статье...
Чтобы создать файл на php в исполняемом скрипте надо всего лишь указать несколько функций:
Рассмотрим сразу пример:
$text = "Какой-то тут текст для записи в файл";
$fp = fopen("file.txt", "w");
fwrite($fp, $text);
fclose($fp);
?>
Тут вы должны знать :
fopen() - функция открывает файл чтения или для записи и уточнениями;
Это уточнения (параметр mode функции fopen) очень важно:
- "r " - открыть файл в php ТОЛЬКО для чтения . Курсор помещается в начало.
- "r+ " - открыть файл в php для чтения и для записи . Курсор помещается в начало. !!! - при этих двух режимах r и r+ файлы уже должны быть созданы(иначе вылезет ошибка Warning: fopen(file.txt) : failed to open stream: No such file or directory in ... ), а мы лишь читаем или у нас есть возможность дописывать.
- "w " - открывается файл ТОЛЬКО для записи. Файл урезается до нулевой длины - то есть затирается. Записывается, что нужно и Курсор ставится в начало.
- "w+ " - открывается файл для записи И ЧТЕНИЯ! Остальное то же самое что и в режиме "w". !!! - при этих двух режимах - если файл не был создан - ПРЕДПРИМЕТСЯ ПОПЫТКА ЕГО СОЗДАТЬ!
- "a " - открыть файл ТОЛЬКО для записи. В отличие от "w" этот параметр не затирает содержимое файла, а ставит курсор в конец строки и добавляет в конец содержимое, которое мы хотели добавить.
- "a+ " - открыть файл для записи и чтения.
fwrite ($fp, $text) - функция записи в файл на php - то есть то что находится в переменной $text записывается в файл, который находится в переменной $fp;
fclose ($fp) - функция закрытия файла, который мы записали в переменную $fp;
Все теперь вы спокойно можете создавать правильно файлы на php, открывать их для чтения и редактирования.
Полезные дополнения и функции PHP для работы с открытым файлом:
while(!feof($fp)){
$mytext = fgets($fp, 99);
echo $mytext."
";
}
здесь выполняется условие - "пока не достигнут конец файла то делай то то" while(!feof($fp))
1. Функция fgets
($fp, 99) - позволяет разделить все содержимое на участки в 99 байт и далее, чтобы это отчетливее увидеть мы помещаем тег
Эта функция string fgets (resource handle [, int length]) по умолчанию принимает в параметр length 1024 байта(1 килобайт), если не указать так и будет. Этот параметр необязателен с PHP 4.2.0 (В случае ошибки возвращает FALSE)
2. а. Функция - int readfile (string filename [, bool use_include_path [, resource context]]) - считываем файл как единое целое.
Читает файл и записывает содержимое в буфер вывода. И возвращает количество выведенных байт. В случае ошибки вернет, если не использована собачка - @readfile.
Что-то подобное получится:
В конце слова тег стоят
.
б. Функция - array file (string filename [, int use_include_path [, resource context]]), делает то же самое, что и функция readfile, за одним исключением она добавляет содержимое файла в массив:
Таким образом можно считывать любые странички в интернете: $lines = file("http://сайт/"); и перебрать массив через функцию foreach;
3а. Функция string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]]) - позволяет получить содержимое в виде одной строки.
Это более универсальная функция PHP для считывания файла, похожа на функцию file, только содержимое возвращается в строку, а не в массив и можно задавать условия - с какого байта начинать - offset и с какого заканчивать - maxlen . При неудаче вернет FALSE.
Важно!!! - в этом случае функция заменяет сразу 3: fopen(), fread() и fclose() и таким образом избавляет от мароки.
3б. Функция int file_put_contents (string filename, mixed data [, int flags [, resource context]]) - идентична последовательному вызову функций fopen(), fwrite() и fclose() - возвращает количество записанных байт.
В котором часть информации будет записываться в файлы. Например, различные отчеты, сверки и т.д. Это удобно, т.к. не обязательно всегда с собой носить пароли от системы управления интернет-магазином, а можно просто скинуть текстовой файлик на флешку.
Для записи и чтения файлов есть функция fopen, рассмотрим на примере.
Запись в файл
$handle = fopen("1.txt", "w");
Тут мы открываем файл, параметр "w" говорит что файл будет для записи. В переменную $handle записываем id-ресурса файла для последующей работы с ним (например записи, или чтения).
Помимо "w" в php есть следующие параметры:
r - чтение
w - запись, если файла не существует, то он создается, если файл существует, то вся информация в нем стирается
a - дозапись, если файла не существует, то он создается, если файл существует, то информация записывается в конец
Чтение из файла
Дозапись файла
Функцией filesize("1.txt")
— мы подсчитываем количество символов в файле, тоесть читаем файл полностью.
Если указать вместо filesize("1.txt")
— цифру 10, то будут прочтены первые 10 символов
Запись массива в файл
Иногда требуется записать в файл не строку, а массив. Для этих целей есть функция serialize/unserialize.
Функция serialize преобразует массив в строку, которую мы можем записать в файл. Функция unserialize делает обратную операцию, преобразует строку в массив.
Вот пример:
Очень часто люди хотят заказать интернет-магазин, в котором часть информации будет записываться в файлы. Например, различные отчеты, сверки и т.д. Это удобно, т.к. не обязательно всегда с собой носить пароли от системы управления интернет-магазином, а можно просто скинуть текстовой файлик на флешку.
OX2 2014-10-03 2014-10-03Эти два метода очень похожи, но есть одно важное отличие: для записи необходимо наличие права на запись. Это значит, что должен размещаться в директории, в которой у вас есть необходимые права.
Если вы работаете локально на своём компьютере, то можете сами установить права: щёлкните правой мышью на папке и выберите "Свойства/Properties". На большинстве вэб-хостов обычно имеется только одна папка с правами записи. Часто она называется "cgi-bin", "log", "databases" и т. п. Если ваш вэб-хост допускает, можно устанавливать права самостоятельно. Обычно можно щёлкнуть правой мышью на папке в FTP-клиенте и выбрать "properties" или "permissions" ил что-то похожее. Скриншот ниже показывает, как это выглядит в FileZilla.
См. также страницы поддержки ваших вэб-хостов.
Обратите внимание, что именно текстовый файл должен находиться в папке с правами на запись, а не РНР-файл.
Открытие текстового файла для записи
Как и при чтении текстового файла, функция используется при записи, но на этот раз режим устанавливается "w" (writing) или "a" (appending).
Разница между writing и appending в том, как размещается "курсор" - в начале или в конце текстового файла.
В примерах этого урока используется пустой текстовый файл textfile.txt. Но вы можете создать свой собственный файл, если желаете.
Сначала попробуем открыть этот текстовый файл для записи:
// Открыть текстовый файл // Закрыть текстовый файл fclose($f); ?>
Пример 1: Запись строки в текстовый файл
Для записи строки мы должны использовать функцию :
Поскольку файл открыть для записи , строка добавляется в начало файла и перезаписывает существующую строку. Если мы открываем файл для appending , строка добавляется в низ файла, который увеличивается на одну строку всякий раз при записи.
Пример 2: Добавление блока текста в текстовый файл
Разумеется, можно также добавлять целый текстовый блок, а не одну строку:
В следующих уроках мы разберём другой способ хранения данных: базы данных.
Под работой с файлами в PHP подразумевается чтение из файла и запись в файл различной информации. Совершенно очевидно, что работать с файлами приходится много, поэтому любой PHP-программист обязан уметь считывать из файла и записывать в файл .
Последовательность работы с файлами в PHP такая:
- Открыть файл.
- Выполнить необходимые действия.
- Закрыть файл.
Как видите, последовательность работы с файлами напоминает работу с файлами через обычный проводник. Только здесь вся работа выполняется автоматически самим PHP-скриптом .
Начнём с первого пункта - открытие файла. Файл открывается с помощью функции fopen() . Первый параметр - это путь к файлу, а второй параметр - модификатор . Давайте сразу разберём возможные модификаторы:
- a - открывает файл только для записи, причём указатель помещается в конец файла.
- a+ a , но также файл открывается ещё и для чтения.
- r - открывает файл только для чтения, а указатель устанавливается в начало файла.
- r+ - то же самое, что и модификатор r , но также файл открывается ещё и для записи.
- w - открывает файл только для записи, указатель устанавливает в начало файла и стирает всё содержимое файла.
- w+ - то же самое, что и модификатор w , только файл открывается также и для чтения.
Также различают два режима работы с файлами: бинарный (обозначается b ) и текстовый (обозначается t ). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.
Это все основные модификаторы, которых Вам вполне хватит. Теперь давайте узнаем, как закрыть файл. Закрывается файл с помощью функции fclose() .
Теперь перейдём к чтению файла с помощью функции fread() . И давайте, наконец-то, приведу пример:
$contents = "";
while (!feof($handle))
$contents .= fread($handle, 4096);
fclose($handle);
?>
В данном примере мы сначала открываем файл для чтения в текстовом режиме (модификатор rt ). Функция fopen() возвращает так называемый дескриптор , с помощью которого можно общаться с файлом, и записываем его в переменную handle . Затем мы в цикле while() до тех пор, пока не достигнут конец файл, считываем содержимое каждый раз по 4096 символов, которые записываем в переменную contents . После завершения процесса считывания - закрываем файл, вновь с помощью дескриптора файла.
Теперь перейдём к записи с помощью функции fwrite() :
$handle = fopen("files/a.txt", "at");
$string = "This is text";
fwrite($handle, $string);
fclose($handle);
?>
После запуска этого скрипта, в файле a.txt добавится строка "This is text ".
Особо внимательные читатели обратили внимание на указатели, о которых я писал чуть выше. Указатель - это текущая позиция воображаемого "курсора" в файле. Именно с него и начинается работа с файлом. Изменить положение указателя можно с помощью функции fseek() :
$handle = fopen("files/a.txt", "rt");
echo $contents."
";
fseek($handle, 0, SEEK_SET);
$contents = fread($handle, 3);
echo $contents."
";
?>
Таким образом, мы сначала считываем 3 символа (в результате, текущее положение указателя сдвигается на 3 позиции). Затем мы устанавливаем указатель на начало файла. И вновь считываем 3 символа. Как Вы и догадались, мы два раза считали одно и тоже. То есть первый раз 3 символа, потом вернулись назад, и вновь считали 3 символа. Также если у функции fseek() заменить SEEK_SET на SEEK_CUR , то тогда второй параметр будет не устанавливать позицию указателя, а сдвигать относительно текущего местоположения. Советую даже попрактиковаться с указателями, потому что для понимания это не так просто. Также рекомендую попытаться записать что-нибудь в файл при позиции указателя, например, в самом начале файла. И обязательно объясните полученный результат.
И, напоследок, хочется привести ещё пару функций, которые позволяют работать с файлами на самом простом уровне: file_put_contens() и file_get_contents() . Функция file_put_contents() записывает в файл, а функция file_get_contents() считывает содержимое из файла. Эти функции очень просты в применении, но возможностей там уже меньше (хотя, как правило, они и не нужны):
file_put_contents("files/a.txt", "This is text 2");
echo file_get_contents("files/a.txt");
?>
В данном скрипте мы сначала записали строку "This is text 2 " в файл, а потом считываем полученное содержимое и выводим его. Как видите, трудно придумать более простой способ чтения из файла и запись в файл .
Вот и все основные моменты работы с файлами в PHP .