Нина Савельева - Курс "Язык программирования PHP"
Функция readfile
Синтаксис:
int readfile ( имя_файла
[, use_include_path])
Функция readfile() считывает файл, имя которого передано ей в качестве параметра имя_файла, и выводит его содержимое на экран. Если дополнительный аргумент use_include_path имеет значение TRUE, то поиск файла с заданным именем производится и по директориям, входящим в include_path.
В программу эта функция возвращает число считанных байтов (символов) файла, а в случае ошибки - FALSE. Сообщения об ошибке в этой функции можно подавить оператором @ .
Пример 9.7. Следующий скрипт выведет на экран содержимое файла my_file1.html и размер этого файла, если он существует. В противном случае выведется наше сообщение об ошибке - строка "Error in readfile".
<?php
$n = @readfile ("my_file1.html");
/* выводит на экран содержимое файла и
записывает его размер в переменную $n */
if (!$n) echo "Error in readfile";
/* если функция readfile() выполнилась
с ошибкой, то $n=false и выводим
сообщение об ошибке */
else echo $n;
// если ошибки не было, то выводим число
// считанных символов
?>
С помощью функции readfile() можно читать содержимое удаленных файлов, указывая их URL-адрес в качестве имени файла, если эта опция не отключена в настройках сервера.
Сразу же выводить содержимое файла на экран не всегда удобно. Порой нужно записать информацию из файла в переменную, чтобы в дальнейшем произвести с ней какие-либо действия. Для этого можно использовать функцию file() или file_get_contents().
Функция file
Функция file() предназначена для считывания информации из файла в переменную типа массив. Синтаксис у нее такой же, как и у функции readfile(), за исключением того, что в результате работы она возвращает массив:
array file ( имя_файла
[, use_include_path])
Что за массив возвращает эта функция? Каждый элемент данного массива является строкой в файле, информацию из которого мы считываем (его имя задано аргументом имя_файла). Символ новой строки тоже включается в каждый из элементов массива. В случае ошибки функция file(), как и все уже рассмотренные, возвращает false. Дополнительный аргумент use_include_path опять же определяет, искать или нет данный файл в директориях include_path. Открывать удаленные файлы с помощью этой функции тоже можно, если не запрещено сервером. Начиная с PHP 4.3 работа с бинарными файлами посредством этой функции стала безопасной.
Например, у нас имеется файл my_file.html следующего содержания:
<h1>Без труда не вынешь
и рыбку из пруда.</h1>
<b>Тише едешь - дальше будешь</b>
Прочитаем его содержимое с помощью функции file():
<?php
$arr = file ("my_file.html");
foreach($arr as $i => $a) echo $i,": ",
htmlspecialchars($a), "<br>";
?>
В результате на экран будет выведено следующее сообщение:
0: <h1>Без труда не вынешь
и рыбку из пруда.</h1>
1: <b>Тише едешь - дальше будешь</b>
Функция file_get_contents
В версиях PHP начиная с 4.3 появилась возможность считывать содержимое файла в строку. Делается это с помощью функции file_get_contents(). Как и две предыдущие функции, в качестве параметров она принимает значение имени файла и, возможно, указание искать его в директориях include_path. Для порядка все равно приведем ее синтаксис:
string file_get_contents (
имя_файла [, use_include_path])
Эта функция абсолютно идентична функции file(), только возвращает она содержимое файла в виде строки. Кроме того, она безопасна для обработки бинарных данных и может считывать информацию из удаленных файлов, если это не запрещено настройками сервера.
Проверка существования файла
Итак, создавать файл мы научились, записывать данные в него - научились, считывать данные из файла - тоже научились. Но вот вопрос: а что если файла, с которым мы пытаемся проделать все эти операции, не существует? Или он недоступен для чтения или записи? Очевидно, что в таком случае ни одна из изученных нами функций работать не будет и PHP выдаст сообщение об ошибке. Чтобы отслеживать такого рода ошибки, можно использовать функции file_exists(), is_writable(), is_readable().
Функция file_exists
Синтаксис:
bool file_exists (имя файла или директории)
Функция file_exists() проверяет, существует ли файл или директория, имя которой передано ей в качестве аргумента. Если директория или файл в файловой системе сервера существует, то функция возвращает TRUE, в противном случае - FALSE. Результат работы этой функции кэшируется. Соответственно очистить кэш можно, как уже отмечалось, с помощью функции clearstatcache(). Для нелокальных файлов использовать функцию file_exists() нельзя.
<?php
$filename = 'c:/users/files/my_file.html';
if (file_exists($filename)) {
print "Файл <b>$filename</b> существует";
} else {
print "Файл <b>$filename</b>
НЕ существует";
}
?>
Функция is_writable
Если кроме проверки существования файла нужно узнать еще, разрешено ли записывать информацию в этот файл, следует использовать функцию is_writable() или ее псевдоним - функцию is_writeable().
Синтаксис:
bool is_writable (имя файла или директории)
Эта функция возвращает TRUE, если файл (или директория) существует и доступен для записи. Доступ к файлу осуществляется под той учетной записью пользователя, под которой работает сервер (чаще всего это пользователь nobody или www). Результаты работы функции is_writable кэшируются.
Функция is_readable
Если кроме проверки существования файла нужно узнать еще, разрешено ли читать информацию из него, нужно использовать функцию is_readable().
Синтаксис:
bool is_readable (имя файла)
Эта функция работает подобно функции is_writable().
<?php
$filename = 'c:/users/files/my_file.html';
if (is_readable($filename)) {
print "Файл <b>$filename</b> существует
и доступен для чтения";
} else {
print "Файл <b>$filename</b>
НЕ существует или
НЕ доступен для чтения";
}
?>
Удаление файла
Последнее, что мы хотим изучить из действий над файлами, - это удаление файлов. Для того чтобы удалить файл с помощью языка PHP, нужно воспользоваться функцией unlink(). Синтаксис этой функции можно описать следующим образом:
bool unlink ( имя_файла)
Данная функция удаляет файл, имеющий имя имя_файла, возвращает TRUE в случае успеха этой операции и FALSE - в случае ошибки. Чтобы удалить файл, нужно тоже иметь соответствующие права доступа к нему (например, доступа только на чтение для удаления файла недостаточно).
<?php
$filename = 'c:/users/files/my_file.html';
unlink($filename);
// удаляем файл с именем
// c:/users/files/my_file.html
?>
Загрузка файла на сервер
Теперь решим более сложную и часто возникающую на практике задачу загрузки файла на сервер. Первое, что нужно сделать, чтобы загрузить файл на сервер, это создать html-форму. Для того чтобы с помощью этой формы можно было загружать файлы, она должна содержать атрибут enctype в теге form со значением multipart/form-data, а также элемент input типа file.
Пример 9.11.
<form enctype="multipart/form-data"
action="parse.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE"
value="30000" />
Загрузить файл: <input type="file"
name="myfile" /><br>
<input type="submit"
value="Отправить файл" />
</form>
Заметим, что мы добавили в форме скрытое поле, которое содержит в себе максимальный допустимый размер загружаемого файла в байтах. При попытке загрузить файл, размер которого больше указанного в этом поле значения, будет зафиксирована ошибка. В браузере созданная нами форма будет выглядеть как строка для ввода текста с дополнительной кнопкой для выбора файла с локального диска (рис 9.1).
Рис. 9.1. Пример формы для загрузки файла на сервер
Теперь нужно написать скрипт, который будет обрабатывать полученный файл.
Вся информация о загруженном на сервер файле содержится в глобальном массиве $_FILES. Этот массив появился начиная с PHP 4.1.0. Если включена директива register_globals, то значения переданных переменных доступны просто по их именам.
Если мы загрузили с компьютера-клиента файл с именем critics.htm размером 15136 байт, то скрипт с единственной командой print_r($_FILES); выведет на экран следующее: