7.7. Файлы cookie
Файлы cookie - это небольшие строки данных, которые создаются Web-сервером и хранятся в компьютере клиента. Кроме имен и значений, файлы cookie имеют определенный срок действия. Некоторые из них существуют только несколько минут, а другие могут существовать месяцами. Это позволяет Web-узлам узнавать посетителей, не запрашивая при этом их пароля при повторном посещении. Для того чтобы узнать побольше о файлах cookie, посетите узел Netscape по адресу <http://developer. netscape.com/docs/manuals/communicator/jsguide4/cookies.htm>.
Использование cookie с PHP также просто, как использование полей форм. Любые файлы cookie, переданные браузером на сервер, преобразуются автоматически в записи массивов _COOKIE и _REQUEST.
Для того чтобы отправить файл cookie, необходимо использовать функцию setcookie, описанную в главе 8, "Браузер ввода-вывода". Web-сервер пересылает файл cookie браузеру как заголовок. Аналогично всем другим заголовкам, файл cookie необходимо установить до того, как отсылать какое-либо содержимое. Поскольку браузер может отказаться принять файл cookie, а многие пользователи просто блокируют прием этих файлов, на работу с файлами cookie нельзя полагаться полностью. Однако использование файлов cookie стало настолько повседневной практикой, что их даже используют для выполнения Web-узлами определенных функций. Это стало обычным приемом разработчиков.
Установка файла cookie не создает немедленно значения в массиве _COOKIE. Установив файлы cookie, вы можете запросить браузер сохранить информацию, которая будет возвращена при последующих запросах страницы. Последующие запросы страницы приводят к созданию переменной cookie. При написании сценария, который требует, чтобы переменная cookie всегда была установлена, ее необходимо установить сразу же после отправки файла cookie.
Тема файлов cookie сейчас - довольно деликатна. Есть мнение, что обычно они являются агентами вторжения. Вы просите какого-то пользователя хранить информацию на его компьютере, несмотря на то, что каждый файл cookie занимает мало места. Мой совет минимизировать работу с файлами cookie. В принципе можно ограничиться одним файлом cookie для всего Web-узла. Если есть возможность идентифицировать пользователя по уникальному идентификатору, вы можете воспользоваться этой информацией для поиска информации о пользователе, например о его предпочтениях. Необходимо помнить, что каждая загрузка страницы приводит к отправке браузером файла cookie. Например, если создано десять файлов cookie размером по 1 Кбайт каждый, то при каждом запросе страницы браузер будет отправлять 10 Кбайт данных.
7.8. Загрузка файлов
Загрузка файлов представляет собой особый случай приема ввода с помощью формы. И половиной решения этой задачи является создание корректного HTML-кода. Спецификация загрузки файлов приведена в RFC 1867. Этот механизм поддерживается браузерами Netscape Navigator 2 и выше и Internet Explorer 4 и выше. Размещение тега ввода в форме HTML с атрибутом типа, установленным со значением file, приводит к появлению на Web-странице окна для просмотра локальной файловой системы. Не поддерживающие загрузки браузеры, вероятнее всего, будут рассматривать это как текстовое окно, поэтому лучше всего работать с формами загрузки файлов в браузерах, имеющих возможность для их интерпретации. Для организации загрузки эти формы должны использовать метод post и снабжаться атрибутом enctype со значением multipart/form-data. Тегу ввода файла должна предшествовать скрытая переменная формы MAX_FILE_SIZE. Ее назначение - задание максимально воз­можного размера принимаемого файла.
После завершения ввода в форму PHP загружает файл и размещает его во временном каталоге на сервере, например в /var/tmp. PHP создает запись в массиве _FILES и, так же как и с другими полями форм, в качестве индекса в массиве _FILES использует имя поля формы. Сама по себе запись представляет массив с элементами, которые приведены в табл. 7.1. Например, имя загруженного файла можно определить из поля portrait с помощью конструкции $_FILE['portrait,][,name'] .
Операции ввода-вывода и доступ к диску
Операции ввода-вывода и доступ к диску
Если вы планируете использовать файл в дальнейшем, переместите его куда-нибудь в постоянное место хранения. В противном случае PHP удалит файл после выполнения запроса текущей страницы. В примере, приведенном в листинге 7.4, показано, как файл загружается и немедленно удаляется.

Листинг 7.4. Загрузка файла

<html> <head>
^^^хЛистинг 7.4</title>
</head>
<body>
<?php
//проверить установку режима загрузки файла if(isset($_FILES['upload_test']))
{
if($_FILES['upload_test,][,error'] != UPLOAD_ERR_OK)
{
print("Загрузка не прошла!<br>n");
}
else
{
// удалить файл
unlink($_FILES['upload_test']['tmp_name']); // отобразить информацию о файле print("Локальный файл: " .
$_FILES['upload_test,][,tmp_name'] .
"<br>n");
print("Имя: " .
$_FILES['upload_test,][,name'] .
"<br>n");
print("Размер: " .
$_FILES['upload_test,][,size'] .
"<br>n");
print("Тип: " .
$_FILES['upload_test,][,type'] .
"<br>n");
print("<hr>n");
}
}
?>
<form enctype="multipart/form-data"
action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE"
alue="1024000">
<input name="upload_test" type="file">
<input type="submit" value="Проверить загрузку">
</form>
</body>
</html>

Размеры загружаемых файлов ограничены директивой upload_max_filesize в файле php.ini. По умолчанию размер файла равен 2 Мбайт. Если размер файла превышает установленный, сценарий будет выполнен так, как если бы файл не загружался. Кроме того, будет выведено соответствующее предупреждение.