информационных технологий» 7 глава
Процессы, которые пользуются рекомендательной блокировкой, будут работать с разделяемым файлом правильно, а остальные… как-нибудь да будут, пока не произойдет «столкновение». «Жесткая блокировка» (которая в PHP не поддерживается) подобна шлагбауму: никто не сможет проехать, пока его не поднимут. Для управления блокировками исползуется функция flock(). · bool flock(int $f, int $operation [, int& $wouldblock]) Функция устанавливает для указанного открытого дескриптора файла $f режим блокировки для текущего процесса. Этот режим задается аргументом $operation и может быть одной из следующих констант: LOCK_SH (или 1) – разделяемая блокировка; LOCK_EX (или 2) – исключительная блокировка; LOCK_UN (или 3) – снять блокировку; LOCK_NB (или 4) – эту константу нужно прибавить к одной из предыдущих, если необходимо, чтобы программа не «подвисала» на flock() в ожидании своей очереди, а сразу возвращала управление. В случае, если был затребован режим без ожидания, и блокировка не была успешно установлена, в необязательный параметр-переменную $wouldblock будет записано значение истина true. В случае ошибки функция возвращает false, а в случае успешного завершения – true. Исключительная блокировка. Каждый процесс-писатель в тот момент, когда он уже почти готов начать писать должен быть единственным, кому разрешена запись в файл. Он хочет стать исключительным. Вызвав функцию flock($f,LOCK_EX), можно быть абсолютно уверен, что все остальные процессы не начнут без разрешения писать в файл, пока процесс-писатель не выполнит все свои действия и не вызовет flock($f, LOCK_UN) или не закроет файл. Если в данный момент процесс не единственный претендент на запись, операционная система просто не выпустит его из «внутренностей» функции flock(), т. е. не допустит его продолжения, пока процесс-писатель не станет единственным. В тот момент, когда процесс, использующий исключительную блокировку, становится активным, все остальные процессы-писатели ожидают (все в той же функции flock()), когда он закончит свою работу с файлом. Как только это произойдет, операционная система выберет следующий исключительный процесс, и т. д.
Пример модели процесса с исключительной блокировкой: <? // инициализация $f=fopen($f,"a+") or die("Ошибка открытия файла!"); flock($f,LOCK_EX); // ждем, пока процесс не станет единственным // только эта программа работает с файлом fflush($f); // записываем все изменения на диск flock($f,LOCK_UN); // больше не будем работать с файлом fclose($f); // Завершение ?> Если необходимо стирать содержимое файла, нельзя использовать режим открытия w – нужно применять a+ и функцию ftruncate(). Пример: $f=fopen($f,"a+") or die("Ошибка открытия файла!"); flock($f,LOCK_EX); // ждем, пока процесс не станет единственным ftruncate($f,0); // очищаем все содержимое файла Перед тем, как разблокировать файл, нужно использовать функцию fflush(), потому что отключение блокировки не ведет к сбросу внутреннего файлового буфера, т. е. некоторые изменения могут быть «сброшены» в файл уже после того, как блокировка будет снята. Исключительная блокировка устанавливается, когда нужно изменять файл. Всегда необходимо использовать при этом режим открытия r, r+ или a+. Нельзя применять режим w. Перед снятием блокировки нужно вызвать функцию fflush(). Разделяемая блокировка. При использовании исключительной блокировки данные из нескольких процессов-писателей не будут перемешиваться, но как быть с читателями? А вдруг процесс-читатель захочет прочитать как раз из того места, куда пишет процесс-писатель? В этом случае он получит «половинчатые» данные. Существуют два метода обхода этой проблемы. Первый – это использовать исключительную блокировку. Ведь функция flock() не знает, что будет выполнено с файлом, для которого она вызвана. Однако этот метод неудачен, потому что процессов-читателей может быть много, а писателей – мало, и к тому же писатели еще и вызываются, скажем, раз в пару минут, а не постоянно, как читатели. В случае использования исключительной блокировки появится много стоящих в очереди процессов-читателей. Но ведь никакой «аварии» не случится, если один и тот же файл будут читать сразу все процессы-читатели, т.к. чтение из файла его не изменяет. Предоставив исключительную блокировку для читателей, получаем проблемы с производительностью, перерастающие в катастрофу, когда процессов-читателей становится больше некоторого определенного порога.
Второй (и лучший) способ подразумевает использование разделяемой блокировки. Процесс, который устанавливает этот вид блокировки, будет приостановлен только в одном случае: когда активен другой процесс, установивший исключительную блокировку. Процессы-читатели будут «поставлены в очередь» только тогда, когда активизируется процесс-писатель. Процесс-писатель должен дождаться, пока читатель не закончит работу. Вызов flock($f,LOCK_EX) обязан подождать, пока активна хотя бы одна разделяемая блокировка. Замечание. Если почти всегда активна разделяемая блокировка, операционная система все равно так распределяет кванты времени, что в некоторые из них можно «включить» исключительную блокировку. Пример модели процесса с разделяемой блокировкой: <? // инициализация $f=fopen($f,"r") or die("Ошибка открытия файла!"); flock($f,LOCK_SH); // ждем, когда процессы-писатели угомонятся // Пока программа работает с файлом, ни одна другая // программа в него не пишет flock($f,LOCK_UN); // говорим, что мы больше не будем работать с файлом fclose($f); // Завершение ?> Разделяемую блокировку необходимо устанавливать, когда нужно только читать из файла, не изменяя его, при этом использовать режим открытия r, и никакой другой. Блокировки с запретом «подвисания». Ко второму параметру функции flock() можно прибавить константу LOCK_NB для того, чтобы функция не ожидала, когда программа может «двинуться в путь», а сразу же возвращала управление в основную программу. Это может пригодиться, если необходимо, чтобы сценарий бесполезно простаивал, ожидая, пока ему разрешат обратиться к файлу.
Пример использования исключительной блокировки с LOCK_NB: $f=fopen("file.txt","a+"); while(!flock($f,LOCK_EX+LOCK_NB)) { echo "Пытаемся получить доступ к файлу <br>"; sleep(1); // ждем 1 секунду } // Работаем Выход из flock() может произойти либо в результате отказа блокировки, либо после того, как блокировка будет установлена – но не до того! Таким образом, когда дождемся разрешения доступа к файлу и произойдет выход из цикла while, будем иметь исключительную блокировку, закрепленную за файлом. Использование блокировки при создании счетчика. Без блокировки файла не обойтись при написании сценария счетчика, который бы при каждом своем запуске увеличивал число, хранящееся в файле, и выводил его в браузер. При большой посещаемости сервера могут быть запущены сразу несколько процессов-счетчиков, которые попытаются обратиться к одному и тому же файлу. Если не принять мер, это приведет к тому, что счетчик рано или поздно «обнулится». Пример простейшего текстового счетчик <? $f=fopen("counter.dat","a+"); flock($f,LOCK_EX); // дальше будем работать только мы $count=fread($f,100); // Читаем значение, сохраненное в файле @$count=$count+1; // Увеличиваем его на 1 (пустая строка = 0) ftruncate($f,0); // Стираем файл fwrite($f,$count); // Записываем новое значение fflush($f); // Сбрасываем файловый буфер flock($f,LOCK_UN); // Отключаемся от блокировки fclose($f); // Закрываем файл echo $count; // Печатаем величину счетчика ?> Здесь применяется только исключительная блокировку, потому что когда нужно вывести на экран счетчик, его нужно увеличить.
10.3 Функции работы с каталогами С точки зрения операционной системы каталоги – это те же самые файлы, только со специальным именем. То есть директорию можно представить себе как файл, в котором хранятся имена и местоположения других файлов и каталогов. С каждым процессом (в частности, и с работающим сценарием) ассоциирован свой так называемый текущий каталог. Все действия по работе с файлами и каталогами осуществляются по умолчанию именно в нем. Например, если открываем файл, указав только его имя, PHP будет искать этот файл именно в текущем каталоге.
Функции для работы с каталогами: · bool mkdir(string $name, int $perms) Создает каталог с именем $name и правами доступа $perms. Права доступа для каталогов указываются точно так же, как и для файлов. Чаще всего значение $perms устанавливают равным 0770 (предваряющий ноль обязателен – он указывает PHP на то, что это – восьмеричная константа, а не десятичное число). Пример: mkdir("my_directory",0755); // создает подкаталог в текущем каталоге mkdir("/data"); // создает подкаталог data в корневом каталоге В случае успеха функция возвращает true, иначе – false. Пользователь не может создать подкаталог в родительском каталоге, права на запись в который у него отсутствуют. Атрибуты доступа 0770 означают «доступен для чтения, записи и исполнения для владельца и его группы». Право на «исполнение» показывает, что пользователь сможет просмотреть содержимое каталога. · bool rmdir(string $name) Удаляет каталог с именем $name. В случае успеха возвращает true, иначе – false. · bool chdir(string $path) Сменяет текущий каталог на указанный. Если такого каталога не существует, возвращает false. Параметр $path может определять и относительный путь, задающийся от текущего каталога. Примеры: chdir("/tmp/data"); // переходим по абсолютному пути chdir("./somathing"); // переход в подкаталог текущего каталога chdir("something"); // то же самое chdir(".."); // переходим в родительский каталог Возвращает полный путь к текущему каталогу, начиная от «корня» (/). Если такой путь не может быть отслежен, возвращает false. Работа с записями. Описываются функции, которые позволяют узнать, какие объекты находятся в указанном каталоге. Механизм работы этих функций базируется на тех же принципах, что и применяемых для файловых операций: сначала каталог открывается, затем из него производится считывание записей, и под конец каталог нужно закрыть. · int opendir(string $path) Открывает каталог $path для дальнейшего считывания из него информации о файлах и подкаталогах и возвращает его идентификатор. Дальнейшие вызовы readdir() с идентификатором в параметрах будут обращены именно к этому каталогу. Функция возвращает false, если произошла ошибка. · string readdir(int $handle) Считывает очередное имя файла или подкаталога из открытого ранее каталога с идентификатором $handle и возвращает его в виде строки. Порядок следования файлов в каталоге зависит от операционной системы. Вместе с именами подкаталогов и файлов будут также получены два специальных элемента: это (ссылка на текущий каталог) и.. (ссылка на родительский каталог). В подавляющем большинстве случаев нам нужно их игнорировать. Если в каталоге все файлы уже считаны, функция возвращает ложное значение. Пример:
$d=opendir("somewhere"); while(($e=readdir($d))!==false) {...} Оператор!== позволяет точно проверить, была ли возвращена величина false. · void closedir(int $handle) Закрывает ранее открытый каталог с идентификатором $handle. Можно не закрывать каталоги, т. к. это делается автоматически при завершении программы, однако лучше все-таки это сделать. · void rewinddir(int $handle) Функция «перематывает» внутренний указатель открытого каталога на начало. После этого можно воспользоваться readdir(), чтобы заново начать считывать содержимое каталога.
10.4 Запуск внешних программ · string system(string $command [,int& return_var]) Функция запускает внешнюю программу, имя которой передано первым параметром, и выводит результат работы программы в выходной поток, т. е. в браузер. Если функции передан также второй параметр – переменная (именно переменная, а не константа!), то в нее помещается код возврата вызванного процесса. Это требует от PHP ожидания завершения запущенной программы. Выходной поток данных программы направляется в браузер. Если нужно этого избежать, воспользуйтесь функциями popen() или exec(). Если же вы, наоборот, нужно, чтобы выходные данные запущенной программы попали прямиком в браузер и никак при этом не исказились (например, вызывается программа, выводящая в стандартный выходной поток какой-нибудь GIF-рисунок), в этом случае в самый раз будет функция PassThru(). · string exec(string $command [,list& $array] [,int& $return_var]) Функция запускает указанную программу или команду, но ничего не выводит в браузер. Вместо этого функция возвращает последнюю строку из выходного потока запущенной программы и, если задан параметр $array (который обязательно должен быть переменной), то он заполняется списком строк в выходном потоке – по одной строке на элемент. Если массив уже содержал какие-то данные перед вызовом exec(), новые строки просто добавляются в его конец, а не заменяют старое содержимое массива. При задании параметра-переменной $return_var код возврата запущенного процесса будет помещен в эту переменную. Функция exec() тоже дожидается окончания работы нового процесса и только потом возвращает управление в PHP-программу. · string EscapeShellCmd(string $command) Нельзя допускать возможности передачи данных из браузера пользователя (например, из формы) в функции system() и exec(). Если это все же нужно сделать, то данные должны быть соответствующим способом обработаны: например, можно защитить все специальные символы обратными слэшами, и т. д. Это и делает функция EscapeShellCmd(). Чаще всего ее применяют в таком контексте: system("cd ".EscapeShellCmd($to_directory)); Здесь переменная $to_directory пришла от пользователя – например, из формы или Cookies. · string PassThru(string $command [,int& $return_var]) Функция запускает указанный в ее первом параметре процесс и весь его вывод направляет прямо в браузер пользователя, один-в-один. Она применяется, если воспользоваться какой-нибудь утилитой для генерации изображений «на лету», оформленной в виде отдельной программы. Пример: Header("Content-type: image/jpeg"); PassThru("cat my_image.jpg"); Функция Header() сообщает браузеру пользователя, что данные поступят в графическом формате JPEG, а последующий вызов утилиты cat с параметром – именем файла с рисунком – заставляет систему «распечатать» файл в браузер пользователя. Тема 11 Работа с датами и временем, посылка писем через PHP
11.1 Представление времени в формате timestamp 11.2 Работа с датами, григорианский календарь 11.3 Посылка писем через PHP
11.1 Представление времени в формате timestamp · int time() Возвращает время в секундах, прошедшее с полуночи 1 января 1970 года по Гринвичу до настоящего момента. Почти все функции по работе со временем имеют дело именно с таким его представлением (которое называется timestamp). · string microtime() Возвращает строку в формате: "микросекунды секунды", где секунды – то, что возвращается функцией time(), а микросекунды – дробная часть секунд, служащая для более точного измерения промежутков времени. · int mktime([int $hour] [,int $minute] [,int $second] [,int $month] [,int $day] [,int $year]) Функция возвращает значение timestamp, соответствующее указанной дате. Все ее параметры необязательны, но пропускать их можно только справа налево. Если какие-то параметры не заданы, на их место подставляются значения, соответствующие текущей дате. Правильность даты, переданной в параметрах, не проверяется. В случае некорректной даты функция формирует соответствующий timestamp. Пример: echo date("M-d-Y", mktime(0,0,0,1,1,1998)); // правильная дата echo date("M-d-Y", mktime(0,0,0,12,32,1997)); // неправильная дата echo date("M-d-Y", mktime(0,0,0,13,1,1997)); // неправильная дата В результате выводятся три одинаковых числа. 11.2 Работа с датами, григорианский календарь · string date(string $format [,int $timestamp]) Функция возвращает строку, отформатированную в соответствии с параметром $format и сформированную на основе параметра $timestamp (если последний не задан – то на основе текущей даты). Строка формата может содержать обычный текст, перемежаемый одним или несколькими символами форматирования: U – количество секунд, прошедших с полуночи 1 января 1970 года; z – номер дня от начала года; Y – год, 4 цифры; y – год, 2 цифры; F – название месяца, например, January (формат выдачи месяца зависит от текущих настроек локали); m – номер месяца; M – название месяца, трехсимвольная аббревиатура, например, Jan; d – номер дня в месяце, всегда 2 цифры (первая может быть 0); j – номер дня в месяце без предваряющего нуля; w – день недели, 0 соответствует воскресенью, 1 – понедельнику, и т. д.; l – день недели, текстовое полное название, например, Friday; D – день недели, английское трехсимвольное сокращение, например, Fri; a – am или pm; A – AM или PM; h – часы, 12-часовой формат; H – часы, 24-часовой формат; i – минуты; s – секунды; S – английский числовой суффикс (nd, th и т. д.). Те символы, которые не были распознаны как форматирующие, подставляются в результирующую строку «как есть». Пример: echo date("l dS of F Y h:i:s A"); echo date("Сегодня d.m.Y"); echo date("Дата файла d.m.Y",filectime("myfile")); · int checkdate(int $month, int $day, int $year) Функция проверяет, существует ли дата, переданная ей в параметрах: вначале ищется месяц, затем – день, и, наконец, – год. Функция проверяет следующее: год должен быть между 1900 и 32 767 включительно; месяц обязан принадлежать диапазону от 1 до 12; число должно быть допустимым для указанного месяца и года (если год високосный). · array getdate(int $timestamp) Возвращает ассоциативный массив, содержащий данные об указанном времени. В массив будут помещены следующие ключи и значения: seconds – секунды; minutes – минуты; hours – часы; mday – число; wday – день недели, число; mon – номер месяца; year – год; yday – номер дня с начала года; weekday – полное название дня недели, например, Friday; month – полное название месяца, например, January. Григорианский календарь – это тот календарь, который мы постоянно используем в своей жизни. В России он был введен Петром I в 1700 году. Каждой дате соответствует свой Julian Day Count (JDC). JDC – это число дней, прошедших с определенной даты (где-то с 4714-го года до нашей эры). Это нужно например, чтобы вычислить количество дней между двумя датами в формате "дд.мм.гггг". Обе даты переводятся в в JDC и определяется разность получившихся величин. · int GregorianToJD(int $month, int $day, int $year) Преобразует дату в формат JDC. Допустимые значения года для григорианского календаря – от 4714 года до нашей эры до 9999 года нашей эры. · string JDToGregorian(int $julianday) Преобразует дату в формате JDC в строку месяц/число/год. Чтобы разбить эту строку на составляющие можно воспользоваться функцией explode(): $jd = GregorianToJD(10,11,1970); echo "$jd<br>\n"; $gregorian = JDToGregorian($jd); echo "$gregorian<br>\n"; $list=explode($gregorian,"/"); · mixed JDDayOfWeek(int $julianday, int $mode) Функция JDDayOfWeek() возвращает день недели, на который приходится указанная JDC-дата. Параметр $mode задает, в каком виде должен быть возвращен результат: 0 – номер дня недели (0 — воскресенье, 1 — понедельник, и т. д.); 1 – английское название дня недели; 2 – сокращение английского названия дня недели.
11.3 Посылка писем через PHP Одно из самых мощных средств PHP – возможность автоматической посылки писем по электронной почте, минуя использование внешних программ и утилит. Функция отсылки встроена в PHP. Функция отправки письма · bool mail(string $to, string $subject, string $msg [,string $headers]) Функция mail() посылает сообщение с телом $msg (это может быть «многострочная строка», т. е. переменная, содержащая несколько строк, разделенных символом перевода строки) по адресу $to. Можно задать сразу нескольких получателей, разделив их адреса пробелами в параметре $to. Пример: mail("rasmus@lerdorf.on.ca ca.ok@oklab.ru, "My Subject", "Line 1\nLine 2\nLine 3"); Если указан четвертый параметр, переданная в нем строка вставляется между концом стандартных почтовых заголовков (таких как To, Content-type и т. д.) и началом текста письма. Этот параметр используется для задания дополнительных заголовков письма. Пример: mail("ssb@guardian.no dk@dizain.ru", "the subject", "Line 1\nLine 2\nLine 3", "From: webmaster@$SERVER_NAME\n". "Reply-To: webmaster@$SERVER_NAME\n". "X-Mailer: PHP/". phpversion()); Гораздо лучше было бы включить указанные заголовки прямо в тело письма $msg (в начало тела), отделив их от самого письма пустой строкой (как в стандарте HTTP). То же самое применимо и к параметру $subject: лучше задавать в нем всегда пустую строку и указывать заголовок Subject в самом письме. Посылка в указанной кодировке. Чтобы не возникало приблем с кодировками при отправке писем, нужно функции mail() передавать только адрес получателя и текст письма. Ни заголовков, ни темы – и то и другое должно присутствовать в самом письме. Пример: $message= "From: Лист рассылки To: Иванов Иван Иванович Subject: Пробная рассылка Content-type: text/plain; charset=windows-1825 Уважаемый товарищ! Всего хорошего!"; Mail("ivanov@ivan.ivanovich.ru","",$message); Заголовок Content-type (в некоторых системах он обязательно должен стоять последним) задает, что, во-первых, письмо доставляется как простой текст (text/plain), а во-вторых, что его кодировка – Windows. Тело письма отделяется от заголовков пустой строкой, с тем, чтобы почтовая программа могла понять, где кончаются заголовки и начинается тело.
Тема 12 Работа с WWW
12.1 Установка заголовков ответа 12.2 Работа с Cookies
12.1 Установка заголовков ответа Рассмотрим средства PHP для работы с заголовками HTTP. Вывод заголовка · int Header(string $string) Функция предназначена для установки заголовков ответа, которые будут переданы браузеру – по одному заголовку на вызов. Она может быть вызвана только до первой команды вывода сценария (если до этого не использовалась функция буферизации ob_start()). Текст вне <? и?> также рассматривается как оператор вывода, потому не нужно делать лишних пробелов до первой «скобки» <? в сценарии (и в особенности в файле, который этим сценарием включается) и, конечно, после последнего ограничителя?> во включаемом файле. Пример: // перенаправляет браузер на сайт PHP Header("Location: http://www.php.net"); // принудительно завершаем сценарий exit; Запрет кэширования. Еще одно полезное приложение функции Header() – запрет кэширования документа браузером и Proxy-серверами. Большинство сценариев формируют документы, которые при каждом запуске программы изменяются. Выход – использовать в начале сценария следующие команды: Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Дата в прошлом Header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 Header("Pragma: no-cache"); // HTTP/1.0 Header("Last-Modified:".gmdate("D,dMYH:i:s")."GMT"); Для полного запрета кэширования нужно всегда посылать 4 указанных заголовка, и ни один пропустить нельзя – в противном случае не сработает либо браузер, либо Proxy-сервер. Получение заголовков запроса. Для получения всех заголовков запроса следует воспользоваться функцией GetAllHeaders(): · array GetAllHeaders() Функция GetAllHeaders() возвращает ассоциативный массив, содержащий данные о HTTP-заголовках запроса клиента, породившего запуск сценария. Ключи массива содержат названия заголовков, а значения – их величины. Пример: $headers = GetAllHeaders(); foreach($headers as $header=>$value) echo "$header: $value<br>\n"; Функция GetAllHeaders() поддерживается PHP только в том случае, если он установлен в виде модуля Apache. 12.2 Работа с Cookies Термин Cookies (это множественное число, произносится как «кукис» или «куки»). В буквальном переводе слово звучит как «печенье», и почему компания Netscape так назвала свое изобретение, неизвестно. Слово Cookies применяется с большой буквы, во множественном числе и мужского рода. В единственном числе это понятие записывается Cookie и произносится на русский манер – «кука». Cookie – это небольшая именованная порция информации, которая может сохраняться в настройках браузера пользователя между сеансами. Причина, по которой применяются Cookies – большое количество посетителей сервера, а также нежелание иметь нечто подобное базе данных для хранения информации о каждом посетителе. Поиск в такой базе может очень и очень затянуться, и, в то же время, нет никакого смысла централизованно хранить столь отрывочные сведения. Использование Cookies фактически перекладывает задачу на плечи браузера, решая одним махом как проблему быстродействия, так и проблему большого объема базы данных с информацией о пользователе. Самый распространенный пример применения Cookies – логин и пароль пользователя, использующего защищенные ресурсы сайта. Эти данные, между открытиями страниц хранятся в Cookies, для того чтобы пользователю не пришлось их каждый раз набирать заново. У каждого Cookie есть определенное время жизни, по истечение которого он автоматически уничтожается. Существуют также Cookies, которые «живут» только в течение текущего сеанса работы с браузером (это могут быть, например, имя и пароль, введенные при авторизации), или же идентификатор сессии. Каждый Cookie устанавливается сценарием на сервере. Сценарий также получает все Cookies, которые сохранены на удаленном компьютере, при каждом своем запуске, так что он может в любой момент времени узнать, что же у пользователя установлено. Для этого он должен послать браузеру специальный заголовок вида: Set-cookie: данные Кроме этого, имеется также информация об имени сервера, установившего этот Cookie, и URL каталога, в котором находился сценарий-хозяин в момент инициализации. Имя сервера и каталог нужны для следующего: сценарию передаются только те Cookies, у которых параметры с именем сервера и каталога совпадают соответственно с хостом и каталогом сценария. Поэтому невозможно получить доступ к «чужим» Cookies – браузер просто не будет посылать их серверу. Однако в PHP этот процесс скрыт за функцией SetCookie(). Недостатки Cookies. Первый – не все браузеры поддерживают Cookies. Второй недостаток заключается в том, что каждый браузер хранит свои Cookies отдельно. То есть Cookies, установленные при пользовании Internet Explorer, не будут «видны» при работе в Netscape, и наоборот. Установка Cookie. Команда установки Cookie – это просто один из заголовков ответа, передаваемых сервером браузеру. То есть, перед тем как выводить Content-type, можно указать некоторые команды для установки Cookie. Формат команды (как и всякий заголовок, записывается она в одну строку): Set-Cookie: name=value; expires=дата; domain=имя_хоста; path=путь; secure Существует и другой подход активизировать Cookie – при помощи HTML-тэга <meta>. Формат тэга: <meta http-equiv="Set-Cookie" content="name=value; expires=дата; domain=имя_хоста; path=путь; secure"> Параметры Cookie: name – имя, закрепленное за Cookie. Имя должно быть URL-кодированным текстом, т. е. состоять только из алфавитно-цифровых символов.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|