>>>

Проектирование, разработка и оптимизация веб-приложений

Работа с файлами

Работа с файлами - важный инструмент PHP.

Включение внешних файлов

В каждый PHP-документ можно включить файл с помощью инструкции include(). Её аргумент: путь к файлу. Этой инструкцией удобно пользоваться при наличии одинаковых кусков кода во многих PHP-программах. Содержимое включаемого файла обрабатывается как простой HTML-текст. Для того, чтобы содержимое этого файла обрабатывалось как PHP-программа, нужно обрамлять его открывающим и закрывающим тегами PHP.

Пример 1

<html>
<head>
    <title>Использование include()</title>
</head>
<body>
<?php
include("top.php");
echo "<H2>...Основная часть...</H2>";
?>
</body>
</html>

Включаемый файл top.php с PHP-программой:

echo "&lt;H1 align=center&gt;...Общее приветствие...&lt;/H1&gt;"

В данном случае результат будет тем же, если включаемый файл top.php содержит только строку HTML-текста:

<H1 align=center>...Общее приветствие...</H1>

Включаемые файлы могут возвращать значения подобно функциям. Использование оператора return прерывает выполнение этого файла так же, как и функции.

Пример 2

<html>
<head>
    <title>Использование инструкции include(), возвращающей значение</title>
</head>
<body>
<?php
$res = include("top.php");
echo "<H2>Включаемый файл вернул $res</H2>";
?>
</body>
</html>

Включаемый файл top.php с PHP-программой:

<?php
$a = 7 * 8;
return $a;
?>

Инструкцию include() можно использовать внутри цикла. В цикле include() выполняется при каждой итерации. Это можно использовать для включения нескольких файлов. Например:

for ($i=1; $i<=5; $i++)
  include("incfile{$i}.htm");

Определение имени включаемого файла и его загрузка производятся повторно при каждом вызове include(). Это означает, что если содержание включаемого файла с момента предыдущего вызова изменилось, то загрузится новое содержание.

Оператор include() также можно включать в тело условного оператора.

Несмотря на сходство по внешнему виду с функцией, include() функцией не является, а представляет собой специальную конструкцию языка.

Для указания что файл нужно подключать только один раз используется оператор include_once()

Анализ файлов

PHP содержит множество функций, дающих информацию о файлах. Наиболее употребимыми являются:

Время возвращается в формате Unix, т.е. представляет собой количество секунд, прошедших после 1 января 1970 г. В примере 2 это число преобразуется в понятный для человека формат с помощью функции date( ).

Пример 3

<html>
<head>
    <title>Информация о файле</title>
</head>
<body>
<?php
$file = "top.php";
infoFile ( $file );
function infoFile ( $f )
{
    if ( !file_exists( $f ) )
    {
        echo "$f не найден!";
        return;
    }
    echo "$f - ".( is_file( $f ) ? "" : "не " )."файл<br>";
    echo "$f - ".( is_dir( $f ) ? "" : "не " )."каталог<br>";
    echo "$f ".( is_readable( $f ) ? "" : "не " )."доступен для чтения<br>";
    echo "$f ".( is_writable( $f ) ? "" : "не " )."доступен для записи<br>";
    echo "размер $f в байтах - ".( filesize( $f ) )."<br>";
    echo "последнее изменение $f - ".( date( "d M Y H:i", filemtime( $f ) ) )."<br>";
    echo "последнее обращение к $f - ".( date( "d M Y H:i", fileatime( $f ) ) )."<br>";
}
?>
</body>
</html>

Внимание! С удаленными файлами эти функции не работают. Их можно применять только к локальной файловой системе.

Управление файлами

PHP содержит множество функций управления файлами. Наиболее употребимыми являются:

В PHP версии 4.3.0 появились новые удобные функции работы с файлами:

Работа с каталогами

В PHP есть несколько функций для работы с каталогами:

Передача файла с сервера. Скачать файл. DownLoad.

Ручной Download, или как скриптом открыть пользователю окошко сохранения файла. Чтобы в браузере открылся диалог "Сохранить файл" с названием файла file.dat, скрипт должен послать такие заголовки:

header("Content-Disposition: attachment; filename=file.dat");
header("Content-Type: application/x-force-download; name=\"file.dat\"");

Готовый пример отправки файла с диска:

<?php
$filename = "DownloadedFile.mp3";   // имя файл предложенное для сохранения в окне браузера
$myFile = $_SERVER['DOCUMENT_ROOT']."/my/file.mp3"; // файл на серевере

$mm_type="application/octet-stream";

header("Cache-Control: public, must-revalidate"); // кешировать
header("Pragma: hack");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($myFile)) );
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");

readfile($myFile); // прочитать файл и отправить в поток
?>

Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php. или указать атрибут download:

<a href="имя.php" download="file.dat">Скачать</a>

Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.

Следующий пример скрипта демонстрирует как организовать поддержку докачки:

Предполагается, что $cd - путь к файлу, $fn - имя файла

<?php
$filename = $cd."/".$fn;
if (!file_exists($filename))
{
    header ("HTTP/1.0 404 Not Found");
    exit;
}
$fsize = filesize($filename);
$ftime = date("D, d M Y H:i:s T", filemtime($filename));
$fd = @fopen($filename, "rb");
if (!$fd){
    header ("HTTP/1.0 403 Forbidden");
    exit;
}
// Если запрашивающий агент поддерживает докачку
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
    $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
    $range = str_replace("bytes=", "", $range);
    $range = str_replace("-", "", $range);
    if ($range) {fseek($fd, $range);}
}
$content = fread($fd, filesize($filename));
fclose($fd);
if ($range) {
    header("HTTP/1.1 206 Partial Content");
}
else {
    header("HTTP/1.1 200 OK");
}
header("Content-Disposition: attachment; filename=$fn");
header("Last-Modified: $ftime");
header("Accept-Ranges: bytes");
header("Content-Length: ".($fsize-$range));
header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
header("Content-type: application/octet-stream");
print $content;
exit;
?>

Функции для работы с каталогами


Размер шрифта:
А
А
А
Цвет сайта:
A
A
A
Изображение:
Вкл.
Выкл.
Обычная версия