Рассмотрим несколько способов сохранения данных в файл.
Функция file_put_contents() для записи в файл
Функция появилась в 5й версии PHP. Это самый простой, наверное, способ записать скалярные данные (строку или текст) в файл.
1 2 3 4 5 6 7 8 9 |
<?php $filename = 'somefile.txt'; $text = 'Text sample.'; //записываем текст в файл file_put_contents($filename, $text); ... //потом его можно прочитать из файла $text = file_get_contents($filename); ?> |
Этот пример очень простой и не использует всех параметров функции. Так как PHP используется типично для создания сайтов, то нужно помнить о параллельных запросах к сайту. Т.е. может возникнуть ситуация одновременной записи данных, чтения данных во время записи и т.п. коллизии. Воспользуемся флажком блокировки — LOCK_EX, который обеспечит нам эксклюзивный доступ к файлу на время записи:
1 2 3 4 |
<?php //записываем текст в файл с блокировкой file_put_contents($filename, $text, LOCK_EX); ?> |
В показанных примерах мы полностью перезаписывали файл, очищая его предыдущее содержимое. Чтобы добавить данные в конец файла, используется флаг — FILE_APPEND.
1 2 3 4 |
<?php //добавляем текст в конец файла file_put_contents($filename, $text, FILE_APPEND); ?> |
Функция возвращает кол-во записанных в файл байт или же FALSE в случае не удачи.
1 2 3 4 5 6 |
<?php //сохраняем текст в файл $bytesCount = file_put_contents($filename, $text); if ($bytesCount === false) echo "При сохранении данных произошла ошибка!"; ?> |
Как записать в файл массив или объект?
Для этого можно воспользоваться той же самой функцией записи текста, но предварительно массив или объект должны быть сериализованы, т.е. преобразованы в текстовый вид. После загрузки данных необходимо будет выполнить обратную операцию — восстановить массив из строки — десериализовать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php //это наш массив (или объект) $arr = array(1,2,3); ... $filename = 'somefile.txt'; $text = serialize($arr); //сериализация //записываем текст в файл file_put_contents($filename, $text); ... //потом его можно прочитать из файла $text = file_get_contents($filename); //восстановить массив из текстового представления $arr = unserialize($text); ?> |
Если вам интересны нюансы сериализации — читайте статью по ссылке.
Функция file_put_contents() идентична последовательному вызову функций — fopen(), fwrite(), fclose(). Рассмотрим их как второй вариант записи в файл на PHP.
Как создать файл и записать в него данные в PHP
Чтобы начать работать с файлом, операционной системе надо выделить дескриптор (описатель). Также надо указать что вы собираетесь делать с файлом, т.е. выбрать режим работы.
1 2 3 4 |
<?php //создали/очистили файл и открыли его для записи $handler = fopen($filename, "w"); ?> |
Режим «w» — (writting), позволит только записывать в файл. Если файл не существует, то он будет создан, если он уже есть — то он будет обнулен.
Если вам не нужно очищать содержимое файла, то используйте режим «w+», который будет аналогичен использованию флага FILE_APPEND. При этом дескриптор позволит как запись так и чтение данных из файла.
1 2 3 4 |
<?php //открыли файл для записи данных в конец файла $handler = fopen($filename, "w+"); ?> |
Итак, дескриптор файла создан. Теперь запишем данные.
1 2 3 |
<?php fwrite($handler, $text); ?> |
Мы можем продолжить использовать открытый дескриптор и далее, дописывая данные. При окончании работы скрипта — он автоматически будет освобожден. Можно освободить его и раньше.
1 2 3 4 |
<?php //закрыли файл fclose($handler); ?> |
Что насчет монопольного доступа к файлу? Аналогично действию флага LOCK_EX мы можем выполнить блокировку следующим образом:
1 2 3 4 5 6 7 8 9 |
//включаем блокировку if (flock($handler, LOCK_EX)) { fwrite($handler, $text); //сняли блокировку flock($handler, LOCK_UN); } else { //блокировку выполнить не удалось echo "Не могу выполнить блокировку!"; } |
Чтение данных из файла выполняет функция fread();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php //открыли файл $handler = fopen($filename, "w+"); //записали данные fwrite($handler, $text); ... //чтобы записать данные реально на диск, нужно либо //закрыть файл или выполнить ф-цию fflush() fflush($handler); //переместили указатель файла в самое начало fseek($handler, 0); //читаем все данные из файла $text = fread($handler, filesize($filename)); //завершили работу с файлом fclose($handler); ?> |
Работать с функциями file_put_contents()/file_get_contents() — проще, но они не дают полного контроля над операциями чтения/записи. Дополнительную инфу полезно будет почитать в мануале PHP.
Уберите эти дурацкие движущиеся фигурки на заднем фоне! Из за них сайт тормозит пипец как.
Вы не первый, кто жалуется, решил пока убрать этот скрипт. Видимо, на машинах с 1-2 ядерами, скрипт кушает многовато процессорного времени.