Ваш первый Сайт С использованием РНР-скриптов
ФУНКЦИИ РНР ДЛЯ РАБОТЫ С ФАЙЛАМИ
Данные счетчика мы будем хранить в текстовых файлах. Почти любая операция с файлами - создание нового файла, чтение или запись в существующий файл предваряется операцией открытия файла. Открытие файла на сервере осуществляется при помощи функции fopen($filename, mode). В качестве первого аргумента функции выступает имя файла, а точнее, путь к нему. Второй аргумент mode задает режим работы с открываемым файлом и принимает следующие значения:
Г - открыть файл только для чтения и приготовиться читать его с начала;
Г+ - открыть файл для чтения и для записи и приготовиться работать с ним с его начала;
W - открыть файл только для записи, предварительно удалив из него все содержимое, причем если файл с указанным именем не существует, то создается новый файл с таким именем;
W+ - открыть файл как для записи, так и для возможного последующего чтения, предварительно удалив из него все содержимое, причем если файл с указанным именем не существует, то создается новый файл с таким именем;
А - открыть файл только для записи и приготовиться дописывать данные в его конец. Если файл с указанным именем не существует, то создается новый файл с таким именем;
А+ - открыть файл для записи и для чтения и приготовиться дописывать данные в его конец. Если файл с указанным именем не существует, то создается новый файл с таким именем.
Для чтения содержимого из файла применяется функция fread($descr, length). Первый аргумент - дескриптор открываемого файла (то, что возвращает функция fopen), второй - количество считываемых байтов. Если мы хотим считать содержимое всего файла, то вместо аргумента length прибегают к функции filesize($f!lename) - возвращает число байтов, содержащихся в файле. Переменная Sfilename означает название файла или путь к нему. В итоге функция fread вместе с аргументами будет выглядеть так: Fread(Sdescr, filesize($filename))
Запись в открытый файл осуществляется функцией fwrite($descr, "выражение"). Здесь аргумент Sdescr тоже означает дескриптор файла, который возвращается функцией fopen, т. е. $descr=fopen($filename, mode). Именно дескриптор, а не путь к файлу используется в функциях fread и fwritel Второй аргумент функции fwrite представляет собой выражение (число, текст и т. п.), которое мы и записываем в открытый файл.
После окончания работы с файлом, его следует закрыть с помощью функции: fclose($descr). Единственный аргумент этой функции - дескриптор ранее открытого файла.
Удалить какой-либо файл можно при помощи функции unlink("filename"), Где filename - название или путь к файлу (не дескриптор!), который нужно удалить.
Закрепим теоретические знания небольшим примером. Создайте в папке Hdocs, где находятся наши файлы, простой текстовый файл. Пусть он будет называться zapisi.txt. Откройте его и запишите две строчки: Первая запись Вторая запись
Сохраните и закройте этот файл.
Создайте новый PHP-файл в PHP-редакторе и сохраните его в папке htdocs под любым названием с расширением php. Запишите в него следующие строки (листинг 4.4):
Листинг 4.4 <?Php
$zapisi="zapisi. txt"; $p=fopen($zapisi, "г");
$n=fread($p, filesize($zapisi));
$myfile=" myfile. txt"; $m=fopen($myfile, "w+"); fwrite($m, "Моя запись в файл");
Fclose($m);
?>
Данная программа состоит как бы из двух программ. В первой части программы мы считываем содержимое файла и выводим его в окно браузера. Во второй части мы создаем новый файл и делаем там запись. Я их объединил в 1 листинг, чтобы не писать 2.
Итак, в первой части программы мы присваиваем переменной Szapisi Путь к нашему текстовому файлу, который мы создали. Поскольку этот файл находится в нашем рабочем каталоге, то в качестве пути к нему достаточно указать просто имя файла с расширением. Потом мы открываем этот файл, но только для чтения, поскольку вторым аргументом функиии fopen мы указали параметр г. Функция возвращает дескриптор файла $р, который и используется в дальнейшем. Затем, с помощью функции fread мы считываем содержимое открытого файла и заносим это содержимое в переменную $п. Функция filesize, как уже говорилось, возвращает количество байтов в файле. Обратите внимание, что аргументом этой функции является путь к файлу (оно у нас в переменной Szapisi), а не его дескриптор. Далее функцией fclose закрываем файл (точнее, его дескриптор). Потом в окно браузера мы выводим содержимое переменной $п, в которую мы записали содержимое файла, считанного при помощи функции fread.
Во второй части кода переменной Smyfile мы присваиваем путь к файлу Myfile.txt. Этот файл мы еще не создали. Функцией fopen. со вторым аргументом «и'+» создается новый пустой файл для записи. Эта функция возвращает дескриптор созданного файла $т. Далее функция fwrite записывает в пустой файл то, что стоит в качестве второго аргумента этой функции, а именно «Моя запись в файл». Последняя строчка закрывает созданный файл. •
Сохраните код и запустите браузер. В окно браузера выведется содержимое файла zapisi.txt, который мы создали вручную.
Теперь зайдите в рабочий каталог. Вы увидите там новый файл myfile.txt, Который и создала написанная вами программа. Открыв этот файл, вы увидите там записанную строчку «Моя запись в файл».
Запись программно (при помощи функции fwrite) что-либо в файл несет в себе одну неприятность. Рассмотрим, например, работу счетчика посещений вашего сайта (более подробно он будет рассмотрен ниже). При посещении посетителем страницы со счетчиком программа открывает текстовый файл с числом посещений при помощи функции fopen, затем делает новую запись, т. е. записывает число, увеличенное на единицу. Затем при помощи функции fclose закрываем файл. Все пройдет нормально, если запись в файл происходит как бы единолично, т. е. зашел один посетитель на страницу, прснрамма для записи в файл успешно сработала. Затем зашел другой посетитель, программа записи опять сработала. Но допустим, что на страницу одновременно зашло несколько посетителей. Программа не может выполняться несколько раз одновременно. Только после того как программа «обслужит» одного посетителя, она сможет корректно «обслужить» другого! При одновременном использовании программы для записи в файл несколькими посетителями могут возникнуть конфликтные ситуации, которые приведут к нарушению или полному разрушению информации в файле для записи. Разумно предположить, что пока программа работает для одного посетителя (даже если на эго уходят микросекунды), допуск к ней других посетителей следует заблокировать. Для блокировки файла имеется специальная функция flockQ. Она блокирует файл и ье позволяет посетителям читать или записывать в него до rex пор. пока блокировка не будет снята. Функция блокировки имеет 3 аргумента, но мы рассмотрим только два из них, которые нам понадобятся: Flock($deckript, type). Первый аргумент представляет собой дескриптор блокируемого файла, который возвращает функция fopen. Второй аргумент type Указывает на тип операции с файлом и нам понадобится 2 значения этого аргумента:
LOCK EX - блокировка файла;
LOCK UN - снятие блокировки, чтобы другие посетители могли получить доступ к файлу.
Функция flock вызывается сразу после открытия файла и перед закрытием файла для снятия с него блокировки. Перепишем листинг 4.4 следующим образом:
Листинг 4.4а (с использованием блокировки файла) <?Php
$zapisi="zapisi. txt"; $p=fopen($zapisi, "г"); flock($p, LOCKEX); $n=fread($p, filesize($zapisi)); flock($p, LOCK_UN); f'close($p); echo $n;
$myfile=" myflle. txt"; $m=fopen($myfile, "w+"); flock($p, LOCK EX);
Fwrite($m, "Моя запись в файл"); flock($p, LOCKUN);
Fclose($m);
?>
Здесь мы применяем блокировку в двух случаях: при чтении файла и при записи в него. При открытии файла, когда посетитель посещает страницу с этим кодом и запускает его, файл открывается и блокируется от доступа к нему других посетителей. После чтения из файла или записи в него блокировка снимается и файл опять готов для чтения и записи другими посетителями. Это прием мы будем использовать для создания счетчика посещения страниц. Там я применял блокировку при записи в файл (файлы) новых данных о посещении страницы.
Для создания счетчика нам понадобится еще несколько функций для работы с файлами.
Функция file(filename) считывает файл и возвращает массив, каждый элемент которого обозначает строку в прочитанном файле.
Функция fileexistsf'flle") проверяет, существует ли файл, что указан в круглых скобках или нет {File - путь к этому файлу). Если файл существует, функция возвращает True. В противном случае - False.
Функция foreach (массив as Переменная) {программный код;} присваивает переменный элемент массива и выполняет программный код. Этот цикл повторяется до тех пор. пока не закончатся все элементы массива.
Функция соип1(массив) возвращает число элементов в массиве.
Функция in_array($znach, $mass) ищет значение Sznach в массиве Smass И возвращает True, если это значение найдено, в противном случае возвращает False.
Для примера создайте в рабочем каталоге новый текстовый файл, например Massiv.Txt. Запишите туда 5 строк: Первый элемент второй элемент третий элемент четвертый элемент пятый элемент
Сохраните и закройте файл. Наберите в PHP-редакторе следующий код (листинг 4.5):
Листинг 4.5 <?php
$massiv=" massiv. txt"; $q=file($massiv); for^ach($q as $stroka)
{
Echo "$stroka<br>";
$r[]=$stroka;
}
Echo count($r);
?>
Итак, функция file возвращает массив строк файла massiv.txt. Массив сохраняется в переменной Sq. Далее функция foreach присваивает переменной Sstroka сначала первый элемент массива Sq. Далее выполняется код в фигурных скобках. А именно, мы выводим в окно браузера значение переменной Sstroka, которой был присвоен первый элемент массива (первая строка файла Massiv.txt). Затем мы значение переменной Sstroka присваиваем первому элементу нового массива $г. Далее цикл повторяется. Переменной Sstroka присваивается уже второй элемент массива Sq (первый элемент массива в переменной Sstroka стирается). Уже второму элементу массива $г присваивается новое значение переменной Sstroka. Итак, цикл будет повторяться, пока не будут перебраны всг элементы массива Sq. Потом мы выводим число строк массива Sr. Это число, как и в массиве Sq, равно пяти, именно столько строк мы написали в текстовом файле massiv.txt. Все строки у нас уже будут в массиве $г[].