Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
- Учебник по PHP (2004).pdf
Скачиваний:
132
Добавлен:
12.04.2015
Размер:
2 Мб
Скачать
☆

вместе с остальными заголовками. Все аргументы, кроме имени, необязательны. Если задан только параметр $name (имя Cookie), то Cookie с указанным именем у пользователя удаляется. Вы можете пропускать аргументы, которые не хотите задавать, пустыми строками "". Аргументы $expire и $secure не могут быть представлены строками, а потому вместо пустых строк здесь нужно использовать

0.

Параметр $expire задает timestamp, который, например, может быть сформирован функциями time() или mktime().

Параметр $secure говорит о том, что величина Cookie может передаваться только через безопасное HTTPS-соединение.

Примеры:

//Cookie на одну сессию, т.е. до закрытия браузера

SetCookie("TextCookie","value");

//Эти Cookies уничтожаются браузером через 1 час после установки

SetCookie("TextCookie",$val,time()+3600); SetCookie("TextCookie",$val,time()+3600,"/~rasmus/",".utoronto.ca",1);

После вызова SetCookie() только что созданный Cookie сразу появляется среди глобальных переменных как переменная с заданным в параметре $name именем. Она появиться и при следующем запуске сценария - даже если SetCookie() в нем и не будет вызвана.

Работа с WWW : SSI и функция virtual()

Немного теории

Для одного и того же документа в Apache нельзя применять два "обработчика". Иными словами, действует принцып: либо PHP, либо SSI. Однако в PHP имеются определенные средства для "эмуляцииquot; SSI-конструкции include virtual.

Конструкция include virtual загружает файл, URL которого указан у нее в параметрах, обрабатывает его нужным обработчиком и выводит в браузер. То ести все происходит так, будто указанный URL был затребован виртуальным браузером. Большинство SSI-файлов ограничиваются использованием этой возможности.

virtual

Имитация include virtual.

Синтаксис :

int virtual(string $url)

Функция virtual() представляет собой процедуру, которая может поддерживаться только в случае, если PHP установлен как модуль Apache. Она делает то же самое, что и SSI-инструкция <-- #include virtual=... -->. Иными словами, она генерирует новый запрос серверу, обрабатываемый им обычным образом, а затем выводит данные в стандартный поток вывода.

Чаше всего функция virtual() используется для запуска внешних CGI-сценариев, написанных на другом языке программирования, или же для обработки SSIфайлов более сложной структуры. В случае, если запускается сценарий, он должен генерировать правильные HTTP-заголовки, иначе будет выведено

сообщение об ошибке. Для включения обычных PHP-файлов с участками кода функция virtual() неприменима - это выполняет оператор include.

Управление выводом : Введение

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

Эти функции не воздействуют на заголовки, посланные функциями header() или setcookie(), а только на функции, подобные echo() и HTML-тексту между блоками

PHP-кода.

<?php

ob_start(); echo "Hello\n"

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>

В примере выше вывод командой echo() будет сохранен в буфере вывода до вызова функции ob_end_flush(). В то же время вызов setcookie() успешно сохраняет cookie, не вызывая ошибки.

Управление выводом : Функции управления выводом

ob_start

Включение буферизации вывода.

Синтаксис :

void ob_start([string output_callback])

После вызова этой функции включается буферизация вывода и, пока она активна, никакие из выводящихся данных не будут посланы браузеру, а будут сохраняться во внутреннем буфере PHP.

Содержимое буфера может быть скопировано в строковую переменную функцией ob_get_contents(). Для вывода содержимого из буфера используется функция ob_end_flush(). Удалить содержимое буфера позволяет функция ob_end_clean().

В аргументе output_callback можно указать функцию, которая будет автоматически вызываться при выводе содержимого буфера. Обычно это используется для модификации содержимого буфера перед выводом (например, сжатия). Тогда при вызове функции ob_end_flush() в указанную функцию будет передаваться содержимое буфера, а то, что она возвратит, будет выведено (заметьте, сама функция не должна ничего выводить).

Буферизация может быть вложенной, и тогда она обрабатывается соответственно вложенности; и содержимое, выводимое из буфера нижнего уровня, будет включаться в буфер верхнего уровня. Не забывайте, что для вывода всего буферизованного содержимого необходимо вызывать функцию ob_end_flush() столько же раз, сколько была вызвана ob_start().

<?php

function c($str) { // получает содержимое буфера return nl2br($str); // возвращает содержимое буфера

}

function d($str) { // получает содержимое буфера

return strtoupper($str); // возвращает содержимое буфера

}

?>

<?php ob_start("c"); ?>

Тут различный текст...

<?php

// преобразовывать текст длее в верхний регистр ob_start("d");

?>

еще что-то...

<?php ob_end_flush(); ?>

.......

<?php ob_end_flush(); ?>

ob_get_contents

Получение содержимого буфера вывода.

Синтаксис :

string ob_get_contents()

Если буферизация неактивна, возвращается false.

ob_get_length

Получение длины данных в буфере вывода.

Синтаксис :

string ob_get_length()

Если буферизация неактивна, возвращается false.

ob_end_flush

Вывод содержимого буфера.

Синтаксис :

void ob_end_flush(void)

После вывода буфер текущего уровня очищается, поэтому вызывайте функцию ob_get_contents() заранее, если необходимо получить его содержимое.

flush

Вывод всего содержимого буфера.

Синтаксис :

void flush(void);

Функция воздействует только на буферизацию PHP и не может контролировать схему буферизации web-сервера или браузера.

Некоторые серверы, в особенности под Win32, буферизируют выводящиеся сценарием данные до того, как сценарий завершится и данные будут отосланы браузеру.

Браузер, в свою очередь, также может буферизировать получаемые данные до их отображения. Netscape, например, буферизирует текст до получения символа завершения строки или открывающего тега, а для таблиц - до получения тега </table> таблицы верхнего уровня.

ob_end_clean

Очистка буфера.

Синтаксис :

void ob_end_clean(void);

Вызов функции отключает буферизацию на текущем уровне.

ob_implicit_flush

Установление режима буферизации.

Синтаксис :

void ob_implicit_flush([int flag]);

Если в аргументе указано ненулевое значение или оно не указано, то при осуществлении каждой операции вывода будет неявно вызыватся функция flush().

Надо отметить, что часто эта функция работает курьезно; например, если в конце сценария вызвать функцию ob_end_clean(), то сценарий не выведет ничего, если вывод из буфера не производился явно другими функциями.

Управление исполнением сценария PHP : Функции управления сценарием

set_time_limit

Установка предельного времени исполнения сценария.

Синтаксис :

void set_time_limit(int seconds)

При запуске сценария PHP запускает системный таймер, и если время (выделенное сценарию для выполнения) истекает, а сценарий еще не завершился, PHP принудительно завершает сценарий (генерируя фатальную ошибку исполнения). Это не допускпет скопления большого количества сценариев, расходующих ресурсы сервера, но, повидимому, "зависших" (например, если в них обнаружился бесконечный цикл или они пытаются дождаться подключения к неотвечающему серверу).

По умолчанию допустимое время исполнения сценария устанавливается в файле конфигурации параметром max_execution_time (обычно оно равно 30 с). Но для

текущего сценария это время можно изменить вызовом данной функции, указав время в секундах в ее аргументе. Если указывается значение 0, то тогда временное ограничение снимается.

Отсчет времени начинается от момента вызова функции. Например, если сценарий уже выполнялся в течении 15 секунд, а затем вызывается функция set_time_limit(20), то общее максимальное время исполнения сценария становится равным 35 секундам.

Если сценарий выполняется в безопасном режиме (с установленным параметром safe mode), то тогда вызов этой функции игнорируется и используется значение из файла конфигурации.

sleep

Задержка выполнения сценария.

Синтаксис :

void sleep(int seconds);

Фукция sleep() выполняет задержку выполненя сценария в секундах (seconds).

usleep

Задержка выполнения сценария в микросекундах.

Синтаксис :

void usleep(int micro_seconds);

Задержка выполнения сценария в микросекундах (micro_seconds). Эта функция не работает в Windows.

die

Вывод сообщения и завершение текущего сценария.

Синтаксис :

void die(string message);

Эта функция выводит сообщение и прекращает выполнение текущего скрипта. Не возвращает значение.

<?php

$filename = '/path/to/data-file'; $file = fopen($filename, 'r')

or die "unable to open file ($filename)"; ?>

exit

Завершает текущий сценарий.

Синтаксис : void exit(void);

Эта функция завершает текущий сценарий. Не возвращает значение.

assert

Проверка истинности значения.

Синтаксис :

int assert(string|bool assertion);

В качестве аргумента функции может быть указано значение или строка, содержащая код PHP (как в функции eval()). Функция проверяет, является ли значение (или выражение) равным false, и, если это так, выполняет определенные действия.

Поведение функции определяется установками в файле конфигурации или при вызове функции assert_options().

Обычно эта функция используется исключительно в целях отладки, для проверки тех значений, которые всегда должны быть истинны (например: подключение модуля, свободное пространство на диске и т.д.).

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

<?php

function handler() { echo "\n* Failed * \n";

}

assert("\$a='1';"); echo "a: $a \n"; assert(0);

// завершать сценарий

echo assert_options(ASSERT_BAIL, 1); // вызвать обработчик

assert_options(ASSERT_CALLBACK, "handler");

//не выдавать сообщений PHP @assert(--$a);

//эта строка не будет выполнена echo "\n ... \n"

Приведенный пример выведет:

a: 1

Warning: Assertion failed in file.php on line 20 0

* Failed *

assert_options

Определение параметров assert.

Синтаксис :

mixed assert_options(int parameter [, mixed value])

Эта функция позволяет определить поведение конструкции assert(). Возвращается предыдущее значение параметра (или значение false при ошибке), указанного в первом аргументе одной из следующих констант:

 

 

 

 

 

 

 

 

 

Параметр

 

ini-параметр

 

Умолчание

 

 

 

ASSERT_ACTIVE

 

asser.active

1

 

Разрешить указание кода в

 

 

 

assert().

 

 

 

 

 

 

 

 

ASSERT_WARNING assert.warning

1

 

Выдавать предупреждение

 

 

PHP.

 

 

 

 

 

 

 

 

ASSERT_BAIL

 

assert.bail

0

 

Завершать выполнение,

 

 

 

если "неистинно".

 

 

 

 

 

 

 

 

ASSERT_QUIET_EVAL assert.quiet_eval 0

 

Не выдавать сообщений.

 

ASSERT_CALLBACK

 

assert_callback

 

(null)

 

Установить функцию в

 

 

 

 

 

 

 

 

качестве обработчика

"неистинных" assert().

Если значение необходимо переопределить, его указывают во втором аргументе.

eval

Производит выполнение строки содержащей PHP код.

Синтаксис :

void eval(string code_str);

Функция eval() производит выполнение строки, заданной в code_str содержащей PHP код. Кстати, это может пригодиться для сохранения кода в текстовом поле базы данных для более позднего выполнения. Не забывайте, что указанный в строке код должен быть синтаксически правильным (например, должны присутствовать точки с запятой после каждой команды и т.п.), в противном случае сценарий будет завершен в этой строке с ошибкой. Учитывайте также, что те значения переменных, которые будут установлены в данной строке, будут использоваться в оставшейся части сценария.

При изменении переменных значений в eval() эти переменные будут изменены и в основных данных.

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

<?php

$string = 'cup'; $name = 'coffee';

$str = 'This is a $string with my $name in it. ';

echo $str;

eval( "\$str = \"$str\";" ); echo $str;

?>

Результатом выполнения этого кода будет:

This is a $string with my $name in it.

This is a cup with my coffee in it.

Управление исполнением сценария PHP : Статус подключений

Внутренне PHP имеет три статуса подключения:

•0 - NORMAL;

•1 - ABORTED (прервано пользователем);

•2 - TIMEOUT (истеклож время ожидания ответа).

При норамальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажал кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему времени, устанавливается флаг состояния TIMEOUT. Возможно определить, как должен вести себя сценарий в зависимости от этих условий.

Если требуется, чтобы сценарий продолжал свое выполнение при разрыве

соединения пользователем, нужно установить в файле конфигурации значение параметра ignore_user_abort = 1 (это также можно сделать в файлах конфигурации Apache). Можно также воспользоваться функцией ignore_user_abort(). В противном случае, сценарий завершается.

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

Если функцией register_shutdown_function() была установлена функция "запускаемая при завершении сценария", то, вне зависимости от статуса подключения, она будет исполнена перед тем, как сценарий завершится. И в "завершающей" функции можно будет выяснить (с помощью функции: connection_aborted(), connection_timeout() и connection_status()), был ли сценарий завершен нормально или досрочно.

connection_aborted

Определения разрыва подключения пользователем.

Синтаксис :

int connection_aborted(void);

Функция connection_aborted() возвращает true, если подключение было разорвано пользователем.

connection_status

Определения статуса подключения.

Синтаксис :

int connection_status(void);

Возвращает значение битового поля, позволяющее выяснить в "завершающей" функции, был ли сценарий завершен досрочно и причину этого. Например, если возвращается 3 (ABORTED | TIMEOUT), то это означает, что время выполнения истекло, а также то, что пользователь отказался от загрузки страницы.

Если возвращается 0 (то есть значение NORMAL), то это означает, что выполнение сценария не было прервано.

connection_timeout

Определения наступления тайм-аута.

Синтаксис :

int connection_timeout(void);

Возвращает true, если время выполнения сценария истекло.

ignore_user_abort

Прерывание сценария при разрыве подключения.

Синтаксис :

int ignore_user_abort([int setting]);

Аргументом setting можно указать, необходимо ли досрочно завершать выполнение сценария, если связь с клиентом потеряна. Если аргумент не указан, то возвращается текущая установка.