программирование, создание программ, учебник Delphi, учебник по программированию, бейсек, делфи, си, паскаль
 
 
 

Управление исполнением сценария PHP

set_time_limit
Установка предельного времени исполнения сценария ,
void set_time_limit (int seconds)
При запуске сценария PHP запускает системный таймер, и если время (выделенное сценарию для выполнения) истекает, а сценарий еще не завершился, РНР принудительно завершает сценарий (генерируя фатальную ошибку исполнения). Это не допускает скопления большого количества сценариев, расходующих ресурсы сервера, но, по-видимому, «зависших» (например, если в них обнаружился бесконечный цикл или они пытаются дождаться подключения к не отвечающему серверу).
По умолчанию допустимое время исполнения сценария устанавливается в файле конфигурации1 параметром max_execution_time (обычно оно равно 30 с). Но для текущего сценария это значение можно изменить вызовом данной функции, указав время в секундах в ее аргументе. Если указывается значение 0, то тогда временное ограничение снимается.
Отсчет времени начинается от момента вызова функции. Например, если сценарий уже выполнялся в течение 15 секунд, а затем вызывается функция set_time_limit(20), то общее максимальное время исполнения сценария становится равным 35 секундам.
Если сценарий выполняется в безопасном режиме (с установленным параметром safe mode), то тогда вызов этой функции игнорируется и используется значение из файла конфигурации.
sleep
Приостановление выполнения (на секунды)
void sleep (int seconds)
Выполнение сценария приостанавливается на указанное число секунд seconds.
См. также usleep().
usleep
Приостановление выполнения (на микросекунды)
void usleep (int micro_seconds)
Выполнение сценария приостанавливается на указанное число микросекунд.
Эта функция не работает в Windows.
См. также sleep().
die
Вывод сообщения и завершение текущего сценария
void die (string message)
Это языковая конструкция, ничего не возвращающая.
<?php $filename =
'/path/to/data-file';
Sfile = fopen (Sfllename. 'r')
or dieC'unable to open file
(Sfilename)"); ?>
См. также exit().
exit
Завершение текущего сценария
void exit(void);
Языковая конструкция, ничего не возвращающая.
См. также die().
assert
Проверка истинности значения
int assert (string]boo! assertion)
В качестве аргумента функции может быть указано значение или строка, содержащая код РНР (как в функции evaK)). Функция проверяет, является ли значение (или выражение) равным FALSE, и, если это так, выполняет определенные действия.
Поведение функции определяется установками в файле конфигурации или при вызове функции assert_options().
Обычно эта функция используется исключительно в целях отладки, для проверки тех значений, которые всегда должны быть истинны (например: подключение модуля, свободное пространство на диске и т. д.).
В целом же выполнение сценария не должно зависеть от таких проверок, а использовать обычные проверки возвращаемых функциями значений.
function handler(){
echo "\n* Failed * \n"; }
assert("\$a='l';");
echo "a: $a \n";
assert(0);
echo assert_options(ASSERT_BAIL,l);
// завершать сценарий
assert_options(ASSERT_CALLBACK."handler");
// вызвать обработчик
@assert(--$a);
// не выдавать сообщений РНР
Echo "\n ... \n";
// эта строка не будет выполнена
Приведенный пример выведет:
а: 1 Warning: Assertion
failed in file.php
on line 20 0 * Failed *
assert_ options
Определение параметров assert
mixed assert_options (int parameter [, mixed value])
Функция позволяет определить поведение конструкции assert(). Возвращается предыдущее значение параметра (или значение FALSE при ошибке), указанного в первом аргументе одной из следующих констант:

Если значение необходимо переопределить, его указывают во втором аргументе.
eval
Интерпретация строки как кода РНР
mixed eval (string code_str)
Исполняет указанный в строке code_str код как обычный код РНР. Кроме всего прочего, это может быть полезно для сохранения кода в текстовом поле базы данных с целью последующего исполнения.
H'le забывайте, что указанный в строке код должен быть синтаксиче-снки правильным (например, должны присутствовать точки с запятой после каждой команды и т. п.), в противном случае сценарий будет заавершен в этой строке с ошибкой. Учитывайте также, что те значе-н«ня переменных, которые будут установлены в данной строке, будут ивспользоваться в оставшейся части сценария.
Если в строке указан оператор return, то тогда выполнение указан-нного кода будет досрочно завершено и возвращенное значение мож-нно получить как значение, возвращаемое самой функции.
<"-?php Ssstnng = 'сундук' .
$>.name = 'кирпич':
$>str = 'Это Sstnng. а внутри
$name.<br>\n';
e;cho $str.
eeval (" \$str = \"$str\". ");
«val (" echo \$str '):
eecho eval ("return 999: ");
?>
Приведенный выше сценарий выведет:
Это Sstnng, а внутри
Spame.<br>\n3ro сундук,
а внутри кирпич.<br> 9399
Статус подключений
Внутренне РНР имеет три статуса подключения:

  • 0 — NORMAL;
  • 1 — ABORTED (прервано пользователем);
  • 2 — TIMEOUT (истекло время ожидания ответа).

При нормальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажимает кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему времени (см. функцию set_tirae_ liraitO), устанавливается флаг состояния TIMEOUT. Возможно определить, как должен вести себя сценарий в зависимости от этих условий.
Если требуется, чтобы сценарий продолжал свое выполнение при разрыве соединения пользователем, нужно установить в файле конфигурации значение параметра ignore_user_abort = 1 (это также можно сделать в файлах конфигурации Apache). Можно также воспользоваться функцией ignore_user_abort(). В противном случае, но умолчанию, если браузер отказывается от приема данных сценария, сценарий завершается.
Чтобы игнорировать завершение сценария таймером, необходимо использовать функцию set_time_limit().
Если функцией register_shutdown_function() была установлена функция «запускаемая при завершении сценария», то, вне зависимости от статуса подключения, она будет исполнена перед тем, как сценарии завершится. И в «завершающей» функции можно будет выяснить (с помощью функций: connection_aborted() ,connection_timeout() и connecti on_ status()), был ли сценарий завершен нормально или досрочно.
connection_aborted
Определение разрыва подключения пользователем
int connection_aborted (void )
Возвращает TRUE, если подключение было разорвано пользователем.
connection_status
Определение статуса подключения
Int connection_status (void )
Возвращает значение битового поля (см. выше), позволяющее выяснить в «завершающей» функции, был ли сценарий завершен досрочно и причину этого. Например, если возвращается 3 (ABORTED | TIMEOUT), то это означает, что время исполнения истекло, а также то, что пользователь отказался от загрузки страницы.
Если возвращается 0 (то есть значение NORMAL), то это означает, что выполнение сценария не было прервано.
connection_tameout
Определение наступления тайм-аута
int connectionjtimeout (void )
Возвращает TRUE, если время исполнения сценария истекло.
ignore_user_abort
Прерывание сценария при разрыве подключения
int ignore_user_abort ([int setting])
Аргументом setting можно указать, необходимо ли досрочно завершать выполнение сценария, если связь с клиентом потеряна. Если аргумент не указан, то возвращается текущая установка.
register_shutdown_function
Регистрация функции в качестве завершающей
int register_shutdown_function (string func)
Регистрирует функцию с именем func в качестве функции, запускаемой после завершения сценария.
Заметьте: так как после завершения функции никакие средства вывода недоступны, это делает для функции, зарегистрированной в качестве «завершающей», недоступными обычные средства отладки, такие как команды print или echo.
Дополнительные функции
get_browser
Определение возможностей браузера
object get_browser ([string user_agent])
Возвращаемая информация извлекается из файла browscap.ini. Для определения браузера используется значение переменной $HTTP_USER_ AGENT или значение, содержащееся в аргументе user_agent.
Информация возвращается в виде свойств объекта и отражает возможности клиентского браузера (например, версию, поддерживает ли он javascript или cookies).
<?php function list_array
($array) { while (list (Jkey. Svalue)
= each (Sarray)) { $str =
"<t»$key:</b> $value<br>\n"; }
return $str }
echo "$HTTP_USER_AGENT<hi">\n";
$browser = get_browser();
echo list_array ((array) Sbrowser). ?>
Содержимое возможного вывода:
Mozilla/4.5 ten] (Xll; U. Linux 2.2.9 1586)
<hr> <lpbrowser_name_pattern:</b>
Mozilla/4\.5.*<br> <b>parent:</b>
Netscape 4.0<bn> <b>platform:</b>
Unknown<br> <b>majorven:</b>
4<br> <b>mnorver:</b> 5<bn>
<b>browser:</b> Netscape<br>
<b>version </b> 4<br> <b>frames:</b>
l<bn> <b>tables:</b> l<bn>
<b>cookiev</b> l<br>
<b>backgroundsounds:</b>
<br> <b>vbscnpt:</b>
<br> <b>javascnpt:</b>
<br> <b>javaapplet: </b>
<br> <b>activexcontrols-</b>
<br> 'b>beta:<:/b> <br> <b>crawler
:</b> <br> <b>authenticodeupdate:
</b> <br> <b>msn:</b> <br>
Для того чтобы функция могла функционировать, следует правильно указать месторасположение файла browscap.ini в файле конфигурации.
highlight_file
Вывод содержимого файла с цветовой разметкой boolean highlight_file (string filename)
Имя (или путь) файла указывается'в аргументе. Цвета выделения синтаксиса определяются в файле конфигурации РНР. Возвращает TRUE или FALSE при ошибке.
Например, чтобы заставить сервер Apache при получении запроса с URL, содержащего значение вида «пир://имя.сервера/5оигсе/путь/ к/файлу.php», выводить листинг файла «1тЬ1р://имя.сервера/путь/к/ файлу, рпр», сделайте следующее.
Добавьте в файл httpd.conf следующий фрагмент:
# Используем директиву "ForceType"
чтобы указать, что значение source в URL
- не каталог, а имя сценария РНР
<Location /source>
ForceType appHcation/x-httpd-php
</Location>
Создайте в корневом web-каталоге следующий файл с именем source:
<HTML><HEAD>
<TITLE'--Source Dibplay</TITLE>
</HEAD><BODY BGCOLOR=#FFEEDD>
<?php Sscnpt = getenv
("PATM_TRANSLATEn"
V if(!$script) { echo "
<BR><B>ERROR: Укажите имя
Сценария</В><ВК>"; lelse {
if (eieg("{\.php|\ inc)$".$scnptl)
{ echo "<Ш>Листинг файла.
$РАТН INFO</Hl>\n<HR>\n";
if(!ehighlight_file($scr1pt))
echo "Ошибка вывода файла":
} else { echo "<H1>ERROR:
Показываются" ." только
листинги PHP файлов </Н1>"; } }
echo "<нр>Распечатано: "
.date("Y/M/d Н:т :s" .timeO): ?>
</BODY>
</HTML>
См. также: rnghlight_string(), show_source().
highlight_string
Выделение строки цветом
void highlight_string (string str)
Функция действует подобно highlight_file(), но использует не содержимое файла, а указанной строки.
См. также: rngh1ight_file(), show_source().
show_source
Синоним функции highlightjile
boolean show_source (string filename)
См. также: highlight_string(), highlight_file().
leak
Имитация утечки памяти
void leak (int bytes)
Функция используется для отладки менеджера памяти, его проверки на способность ликвидировать неосвобожденные блоки памяти после завершения сценария. Размер блока памяти указывается в байтах аргументом bytes.
uniqid
Генерация уникального идентификатора
int uniqid (string prefix [, boolean leg])
Возвращает идентификатор, сгенерированный на основе значения текущего времени в микросекундах и имеющий префикс prefix.
Если указывается необязательный аргумент leg со значением TRUE, к концу идентификатора будет добавляться «комбинированный хеш энтропии LCG», делающий его значение более уникальным.
Префикс используется для получения уникальных идентификаторов, генерируемых одновременно на разных машинах (когда время одинаковое). Его длина может достигать 114 символов. Если в качестве его значения передается пустая строка, то длина сгенерированного идентификатора будет 13 символов (при lcg=TRUE — 23 символа).
Принято также дообрабатывать полученное значение криптографическими методами (например, это часто делается в идентификаторах сессий).
$token = md5 (uniqid ("")):
// без случайной части
$better_token = md5 (uniqid (randO));
// посложнее
Эти строки генерируют 32 байта (128-битное шестнадцатеричное число): они обладают максимальной уникальностью, которая только может потребоваться.
pack
Пакетирование данных в двоичную строку
string pack (string format [, mixed args ...])
В первом аргументе format указывается строка формата, а в последующих — элементы данных, вносимых в результирующую строку. Алгоритм функции заимствован из Perl и по большей части использует те же коды.
Строка формата состоит из кодов двух видов: кода типа элементов данных и числителя (длины данных или количества элементов данных данного типа), указанного после кода типа. Числитель может быть числом или значением «*» (тогда длина определяется автоматически). Если числитель не указывается, он считается равным 1. Для кодов a, A, h, H числитель указывает количество символов, вносимых в строку данных; а для кода 0 — абсолютную позицию в строке результата, начиная с которой вносятся символы следующего элемента данных.
echo pack("А"."Abe"),"
",pack("A6"."Abe")."|"
,pack("A*"."Abe")."|":
//выводит: A|Abc |Abe|
Допустимы следующие коды типов данных:

  • а — строка, дополняемая нулевым символом (\0);
  • А — строка, дополняемая пробелом;
  • h — строка шестнадцатеричных цифр (младший полубайт первый);
    packC'h*"."0123456789abcDEF")
    == «\xlO\x32\x54\x76\x98\xBA\xDC\xFE»
  • H — строка шестнадцатеричных цифр (старший полубайт первый);
    pack("H16"."0123456789abcDEF")
    == «\x01\x23\x45\x67\x89\xAB\xCD\xEF»
  • с — байт со знаком;
    pack("c*"."X".-1.255.256) == «\0\xFF\xFF\0» unpackC'c*". pack("c*"."X".-1.255.256» — (O.-l.-l.O)
  • С — байт без знака;
    pack("C*"."X".-l 255.256) =
    = «\0\xFF\xFF\0» unpackC'C*"
    . Dack("C*","X".-1.255.256)) == (0.255.255.0)
  • s — знаковое короткое число (2 байта, порядок байтов системы);
  • S — беззнаковое короткое число (2 байта, порядок байтов системы);
  • n — беззнаковое короткое число (2 байта, старший байт вначале);
    pack("n*".OxF951.Oxlllllllll) == «\xF9\x51\xFF\xFF»
  • v — беззнаковое короткое число (2 байта, младший байт вначале);
    pack("v",OxF951) == «\x51\xF9»
  • i — знаковое длинное число (4 байта, порядок байтов системы);
  • L — беззнаковое длинное число (4 байта, порядок байтов системы);
  • N — беззнаковое длинное число (4 байта, старший байт вначале);
  • V — беззнаковое длинное число (4 байта, младший байт вначале); j
  • i — знаковое целое число (зависит от системы);
  • I — беззнаковое целое число (зависит от системы);
  • f — дробное float (зависит от системы и представления);
  • d — дробное double (зависит от системы и представления);
  • х — байт \0;
  • X — удалить предыдущий байт; pack("x2A*X2A."Abc".'V) == «\0\ОАя»
  • @ — заполнять символами \0 от текущего места и до указанной позиции.
    pack("A*(a4A*"."Ab"."ZZ") =
    = «Ab\0\OZZ» pack("A*(aiA*"."Abccccc"."ZZ")
    == «AZZ»

Заметьте, что указание на присутствие знака в числе реально используется только при распаковке. Не забывайте также, что РНР хранит числа в формате знаковых, системного размера. И проверяйте, умещается ли большое число (РНР может скрыто преобразовать его в дробное) в отведенный для него размер (иначе оно будет урезано без вашего ведома).
unpack
Распаковка двоичной строки
array unpack (string format, string data)
Возвращает в ассоциативном массиве элементы данных, извлеченных из строки data, согласно формату format. В строке формата указываются последовательности «код_формата [числитель] имя_элемента» без пробелов, разделенные слешем <</>>. Описание кодов формата и комментарии см. в функции pack().
Sdata - unpack ("ccn". -1.128.0xFC9a):
// Sdata == "\xFF\x80\xFC\x9a"
Sarray = unpack ("c2char/mnt". $data):
// в массиве возвращаются:
// $array["charl"] = -1
// $array["char2"] =
-128 - переполнение разрядов
// $array["int"] = OxFC9A
iptcparse
Интерпретация двоичного блока 1РТС
array iptcparse (string iptcblock)
Функция извлекает данные из маркеров АРР (обычно они содсржатся в файлах Интернет-графики) и возвращает полученную информацию в массиве.
См. пример в функции GetlmageSize(), а также информацию по адресу: http://www.iptc.org/.
Отслеживание и обработка ошибок
РНР имеет следующие типы ошибок и предупреждений:

Указанные значения в виде чисел или консгант можно комбинировать, формируя битовую маску ошибок, о которых необходимо сообщать в ходе исполнения сценария. Для комбинирования используются битовые операторы, но в конфигурационном файле php.ini ' распознаются только «|», «-», «!» и <<&>>.
В PHP 4 по умолчанию разрешены сообщения вида E_ALL & -EJJOTICE, то ость сообщаться должно все, кроме обычных сообщений. Можно переопределить эту установку параметром файла конфигурации еггог_ reporting (ее также можно указывать в файлах конфигурации сервера Apache); а во время исполнения — функцией error_reporting().
Если при вызове функции перед ее именем указать символ «@», то в случае возникновения ошибки в этой функции сообщение о нем выдаваться не будет.
В настоящее время оператор игнорирования ошибок блокирует даже выдачу сообщений о критических ошибках, при возникновении которых сценарий досрочно завершается.
Если разрешен параметр конфигурации track_errors, то сообщение об ошибке сохраняется в глобальной переменной $php_errormsg.
«?php // определенный
пользователем обработчик ошибок
function userErrorHandler (Serrno. Serrmsg.
Sfilenamp Slirenum. Svarb) { $dt = date
("Y-m-d H i:s (Т)"). // время возникновения
ошибки Serrortype = array
( 1 => "Error". 2 => "Warning".
4 => "Parsing Error". 8 => "Notice".
16 => "Core Error". 32 =>
"Core Warning". 64 => "Compile Error".
128 => "Compile Warning". 256 =>
"User Error". 512 => "User Warning".
1024=> "User Notice" );
$err .= "время ($dt). номер ошибки
($errno). ": $err .= "тип ошибки
C'.$errortype[$errno]."): ":
$err = "\"$errmsg\", файл
\"$filename\". строка (".
$err .= $linenum.")\n";
I $user_errors - array
(E_USER_ERROR. E_USER_WARNING.
E_USER_NOTICE): if (in_array($errno.
$user_errors))
echo $err;
// выдать сообщения для ошибок
пользователя // сохранить событие
ошибки в системном журнале
error_log($err. 3.
"/usr/local/php4/error.log"): }
// установить уровень контроля
ошибок и обработчик error_reporting(0)
: // не выводить сообщения РНР
$old_error_handler = set_error_handler
("userErrorHandler");
// неопределенная константа вызывает
предупреждение
$t = _NOT_DEFINED_CONSTANT.
tngger_error("Mos ошибка". E_USER_ERROR);
tngger_error
("Moe предупреждение".
E_USER_WARNING): ?>
Функции обработки ошибок
errorjog
Посылка сообщения об ошибке
int error_log (string message, int message_type [, string destination [, string extra_headers]])
Сообщение, посылаемое этой функцией, может быть направлено в журнал системных сообщений web-сервера, порт TCP или в файл.
В первом аргументе, message, указывается само содержание сообщения; во втором, messagejtype — куда оно должно быть направлено. Назначение обозначается следующими значениями:

  • 0 — сообщение заносится в системный журнал событий (файл) согласно установке параметра конфигурации error_log;
  • 1 — сообщение отправляется по электронной почте, по адресу, указанному в аргументе destination. Это единственный тип сообщения, использующий четвертый параметр, extrajieaders, в котором можно указать дополнительные заголовки (как в функции Mail());
  • 2 — сообщение посылается через подключение отладки. Это возможно только в случае, если параметр удаленной отладки был разрешен в файле конфигурации. Для этого также должен быть определен адрес хоста (имя или его адрес IP) и порт сокета, который будет принимать сообщения отладки; это можно указать в аргументе destination или параметрах конфигурации;
  • 3 — message добавляется в конец файла destination.

Возможные варианты применения функции:
if (!0ra_l_ogon (Susername. Spassword))
{ erroMog ("Сервер Oracle недоступен!".
О). } if (!($foo = allocate_new_foo())
{ rroMog ("Нельзя выделить FOO!".
1. "operator@mydomain.com").
} // other ways of calling error_log():
errorjog ГУ нас ошибка!".
2. "127.0.0 1.7000"); rrorjog
("У нас ошибка1". 2. "loghost");
eri~or_loq ("У нас ошибка!".
3. "/var/tmp/my-errors.log"):
error_reporting
Установка видов сообщаемых ошибок
int errorj-eporting ([int level])
Возвращает предыдущую установку типа сообщаемых ошибок; если указан аргумент, то заново переопределяет ее. В аргументе можно указывать константу, число или битовую маску. Старайтесь использовать константы вместо численных значений, чтобы сохранить совместимость с будущими версиями РНР.
errorj-eporting (2039).
// в РНР 4 эквивалент E_ALL " EJIOTICE
error_reporting (E_ALL * E_NOTICE);
// установка по умолчанию
error_reporting(0):
// отключить сообщения об ошибках
errorj-eporting (EJRROR E_WARNING
| E_PARSE):
/* Общие ошибки выполнения */
error j-eporting (EJRROR | E_WARNING
| E_PARSE | EJIOTICE);
/* также сообщать о неизвестных переменных */
error_reporting (E_ALL).
/* сообщать все ошибки */
set_error_handler
Установка пользовательского обработчика ошибок
string set_error_hand1er (string error_handler)
Функция возвращает имя функции, ранее определенной в качестве обработчика ошибок (или FALSE при ошибке), и устанавливает, в качестве нового обработчика, функцию с указанным в аргументе еггог_ handler именем.
Обычно пользовательский обработчик ошибок работает в паре с функцией tngger_error(), генерирующей ошибку; это может быть использовано (подобно аналогичной конструкции работы с исключениями в С) для освобождения выделенных ресурсов (например, удаления созданных файлов), если сценарий не может нормально завершиться.
Функция, устанавливаемая в качестве обработчика ошибок, должна принимать пять параметров (три последних являются дополнительными и могут не обрабатываться):

  • код ошибки;
  • строку, описывающую ошибку;
  • имя сценария, в котором произошла ошибка;
  • номер строки сценария, содержащей ошибку;
  • контекст (массив, содержащий значения переменных, в момент-возникновения ошибки).

<?php // определить константы
пользовательских ошибок define
(FATAL.E_USER_ERROR);
define (ERROR.E_USER_WARNING).
define (WARNING.E_USER_NOTICE).
// установить, какие ошибки должны
обрабатываться в сценарии
errorj-eporting (FATAL | ERROR | WARNING);
// пользовательский обработчик ошибок
function myErrorHandler ($errno. Serrstr.
ierrfile. Serrlme) { switch (Serrno)
{ case FATAL:
echo "<b>Критическая ошибка</b>
[Serrno] $errstr<br>\n";
echo " в строке: Serrline. файла:
".Serrhle:
echo ", PHP ".PHP_VERSION."
(".PHP_OS.")<br>\n":
echo "Aborting...<br>\n":
exit -1:
break case ERROR:
echo "<b>Ошибка</b> [Serrno] $errstr
<br>\n":
break: case WARNING:
echo "<b>Предупреждение</b>
[Serrno] Serrstr<br>\n";
break:
default:
echo "Неизвестный тип ошибки:
[Serrno] $errstr<br>\n";
break; } } // функция для проверки
обработки ошибок (масштабирование
массива) function scale_by_log
(Svect. Sscale) { if ( hs_numenc
(Sscale) || Sscale <= 0 )
trigger_error("вычислить log(x).
для x <= 0 нельзя. ". "(x = Sscale)".
FATAL), if (hs_array(Svect))
{ trigger error("Требуется массив
". ERROR); return null: }
for ($1=0; $i<count(Svect): Si++)
{ if (!is_numenc($vect[$i]))
thgger_error( "Элемент (SI)
не число, и его значением".
" считается О". WARNING);
$temp[Si] = log(Sscale) *
$vect[Si]: } return Stemp: }
// установить пользовательский
обработчик ошибок
Sold_error_handler
= set_error_handler
("myErrorHandler");
Sa = array(2.3."foo".5.5.43.3.21 11);
pnnt_r(Sa).

Sb = scale_by_log(Sa. M_PI);
// здесь выдается предупреждение
echo "Массив, масштабированный
на логарифм(Пи): "; pnnt_r($b):
$с = scale_by_log("not array".2 3);
// здесь ошибка var_dump($c).
$d = scale_by_log($a. -25)
.// здесь критическая ошибка
echo "Продолжение сценария .": ?>
При выполнении сценария вывод будет следующим:
Array ( )[0] => 2 [1] => 3
[2] => too [3] => 5 5 [4] => 43
3 [5] <=> 21 11 )
<b>Прелупреждение</b>
[1024] Элемент (2) не число.
v его значением считается 0<bг>
Массив, масштабированный на
логарифм(Пи) Атау (
[0] => 2.2894597716988
[1J => 3.4341896575482 [2]
»> О [3] => 6 2960143721717 [4
] => 49 566804057279 [5] =>
24 165247890281 )
•Ф>Ошибка</b> Г512]
Требуется массив <br>
NULL <b>Критическая
ошибка</b> [256] вычислить
log(x) для х <= 0 нельзя,
(х --- -2 5)<br> в строке 37.
файла. Е-\ooo\php39.php3.
РНР 4.0.5 (WINNT)<br>
Aborting. . <br>
Не забывайте, что при установке пользовательского обработчика ошибок стандартный обработчик РНР не исполняется. Установки еггог_ reporting() также не будут иметь эффекта, и пользовательский обработчик должен уметь обрабатывать все виды ошибок (значение еггог_ reporting() можно выяснить и действовать соответственно). Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, выоод ошибок для которой был блокирован оператором «@».
Также помните, что завершать сценарий в обработчике необходимо t явно (например, с помощью функции сhе()), если, конечно, в этом есть необходимость. Если обработчик ошибок завершается с помощью return, то выполнение сценария продолжается с того места, в котором возникла ошибка (то есть исполняются инструкции, которые следуют за той инструкцией, в которой возникла ошибка).
См. также: error_reporting(), restore_error_handier(), trigger_error(), user_error()
error_reporting
Установка видов сообщаемых ошибок
int errorj-eporting ([int level])
Возвращает предыдущую установку типа сообщаемых ошибок; если указан аргумент, то заново переопределяет ее. В аргументе можно указывать константу, число или битовую маску. Старайтесь использовать константы вместо численных значений, чтобы сохранить совместимость с будущими версиями РНР.
errorj-eporting (2039).
// в РНР 4 эквивалент E_ALL " EJIOTICE
error_reporting (E_ALL * E_NOTICE);
// установка по умолчанию
error_reporting(0):
// отключить сообщения об ошибках
errorj-eporting (EJRROR E_WARNING
| E_PARSE):
/* Общие ошибки выполнения */
error j-eporting (EJRROR | E_WARNING
| E_PARSE | EJIOTICE);
/* также сообщать о неизвестных переменных */
error_reporting (E_ALL).
/* сообщать все ошибки */
set_error_handler
Установка пользовательского обработчика ошибок
string set_error_handler (string error_handler)
Функция возвращает имя функции, ранее определенной в качестве обработчика ошибок (или FALSE при ошибке), и устанавливает, в качестве нового обработчика, функцию с указанным в аргументе еггог_ handler именем.
Обычно пользовательский обработчик ошибок работает в паре с функцией tngger_error(), генерирующей ошибку; это может быть использовано (подобно аналогичной конструкции работы с исключениями в С) для освобождения выделенных ресурсов (например, удаления созданных файлов), если сценарий не может нормально завершиться.
Функция, устанавливаемая в качестве обработчика ошибок, должна принимать пять параметров (три последних являются дополнительными и могут не обрабатываться):

  • код ошибки;
  • строку, описывающую ошибку;
  • имя сценария, в котором произошла ошибка;
  • номер строки сценария, содержащей ошибку;
  • контекст (массив, содержащий значения переменных, в момент-возникновения ошибки).

<?php // определить константы
пользовательских ошибок define
(FATAL.E_USER_ERROR);
define (ERROR.E_USER_WARNING).
define (WARNING.E_USER_NOTICE).
// установить, какие ошибки должны
обрабатываться в сценарии
errorj-eporting (FATAL | ERROR | WARNING);
// пользовательский обработчик ошибок
function myErrorHandler ($errno. Serrstr.
ierrfile. Serrlme) { switch (Serrno)
{ case FATAL:
echo "<b>Критическая ошибка</b>
[Serrno] $errstr<br>\n";
echo " в строке: Serrline. файла:
".Serrhle:
echo ", PHP ".PHP_VERSION."
(".PHP_OS.")<br>\n":
echo "Aborting...<br>\n":
exit -1:
break case ERROR:
echo "<b>Ошибка</b> [Serrno] $errstr
<br>\n":
break: case WARNING:
echo "<b>Предупреждение</b>
[Serrno] Serrstr<br>\n";
break:
default:
echo "Неизвестный тип ошибки:
[Serrno] $errstr<br>\n";
break; } } // функция для проверки
обработки ошибок (масштабирование
массива) function scale_by_log
(Svect. Sscale) { if ( hs_numenc
(Sscale) || Sscale <= 0 )
trigger_error("вычислить log(x).
для x <= 0 нельзя. ". "(x = Sscale)".
FATAL), if (hs_array(Svect))
{ trigger error("Требуется массив
". ERROR); return null: }
for ($1=0; $i<count(Svect): Si++)
{ if (!is_numenc($vect[$i]))
thgger_error( "Элемент (SI)
не число, и его значением".
" считается О". WARNING);
$temp[Si] = log(Sscale) *
$vect[Si]: } return Stemp: }
// установить пользовательский
обработчик ошибок
Sold_error_handler
= set_error_handler
("myErrorHandler");
Sa = array(2.3."foo".5.5.43.3.21 11);
pnnt_r(Sa).
Sb = scale_by_log(Sa. M_PI);
// здесь выдается предупреждение
echo "Массив, масштабированный
на логарифм(Пи): "; pnnt_r($b):
$с = scale_by_log("not array".2 3);
// здесь ошибка var_dump($c).
$d = scale_by_log($a. -25)
.// здесь критическая ошибка
echo "Продолжение сценария .": ?>
При выполнении сценария вывод будет следующим:
Array ( )[0] => 2 [1] => 3
[2] => too [3] => 5 5 [4] => 43
3 [5] <=> 21 11 )
<b>Прелупреждение</b>
[1024] Элемент (2) не число.
v его значением считается 0<bг>
Массив, масштабированный на
логарифм(Пи) Атау (
[0] => 2.2894597716988
[1J => 3.4341896575482 [2]
»> О [3] => 6 2960143721717 [4
] => 49 566804057279 [5] =>
24 165247890281 )
•Ф>Ошибка</b> Г512]
Требуется массив <br>
NULL <b>Критическая
ошибка</b> [256] вычислить
log(x) для х <= 0 нельзя,
(х --- -2 5)<br> в строке 37.
файла. Е-\ooo\php39.php3.
РНР 4.0.5 (WINNT)<br>
Aborting. . <br>
Не забывайте, что при установке пользовательского обработчика ошибок стандартный обработчик РНР не исполняется. Установки еггог_ reportingO также не будут иметь эффекта, и пользовательский обработчик должен уметь обрабатывать все виды ошибок (значение еггог_ reportingO можно выяснить и действовать соответственно). Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, выоод ошибок для которой был блокирован оператором «@».
Также помните, что завершать сценарий в обработчике необходимо t явно (например, с помощью функции сhе()), если, конечно, в этом есть необходимость. Если обработчик ошибок завершается с помощью return, то выполнение сценария продолжается с того места, в котором возникла ошибка (то есть исполняются инструкции, которые следуют за той инструкцией, в которой возникла ошибка).
См. также: error_reporting(), restore_error_handier(), trigger_error(), user_error()
restore_error_handler
Восстановление предыдущего обработчика ошибок
void restore_error_handler (void)
Устанавливает в качестве функции обработчика ошибок ту, котораябыла таковой до последнего вызова функции set_error_handler(). Предыдущим обработчиком может быть ранее установленный нользовательский обработчик или встроенный обработчик PUP.
См. также: errorj-eporting(), set_error_handler(), trigger_error(), user_ error().
trigger_error
Генерация ошибки
void trigger_error (string errorjnsg [, int error_type])
Явно вызывает функцию, установленную для обработки ошибок, и обычно используется в паре с обработчиком ошибок (см.: set_ error_handler()). Функция способна генерировать только пользовательские типы ошибок (семейство констант EJJSER), и по умолчанию, если не указан тип ошибки error_type, он считается E_USER_NOTICE.
Возможно конструировать сложные конструкции генерации и обработки ошибок и исключительных ситуаций.
if (assert ($divisor == 0))
trigger_error ("Нельзя делить на 0 ".
E_USER_FRROR)
См. также: error_reporting(), set_error_handler(), restore_error_handler(), user_error().
user_error
Синоним функции trigger_error()
void user_error (string error_msg [, int error_type])
Управление выводом
Данная группа функций позволяет управлять тем, как РИР при выполнении сценария выводит информацию. Это может быть полезно в различных ситуациях, в особенности при посылке браузеру HTML-заголовков (headers) после того, как сценарий начал выводить HTML-текст. (В обычном случае невозможно послать заголовок после того, как был начат вывод текста.) Эти функции не воздействуют на заголовки, посланные функциями header() или setcookie(), а только па функции, подобные echo() и HTML-тексту между блоками РНР-кода.
<?php ob_start():
echo "HelloXn"
\ I setcookie ("cookiename".
"cookiedata"):
end flush() : / >>
В примере выше вывод командой echo() будет сохранен в буфере вывода до вызова функции ob_end_flush(). В то же время вызов setcookie() успешно сохраняет cookie, не вызывая ошибки.
См. также: header() и setcoukie().
ob_start
Включение буферизации вывода
void ob_start ([string output_callback])
После вы-зова этой функции включается буферизация вывода и, пока она активна, никакие из выводящихся данных не будут посланы браузеру, а будут сохраняться во внутреннем буфере РНР.
Содержимое буфера может быть скопировано в строковую переменную функцией ob_get_contents(). Для вывода содержимого из буфера используется функция ob_end_f"lush(). Удалить содержимое буфера позволяет функция ob_end_clean().
В аргументе output_callback можно указать функцию, которая будет автоматически вызываться при выводе содержимого буфера. Обычно это используется для модификации содержимого буфера перед выводом (например, сжатия). Тогда при вызове функции ob_end_flush() в указанную функцию будет передаваться содержимое буфера, а то, что она возвратит, будет выведено (заметьте, сама функция не должна ничего выводить).
Буферизация может быть вложенной, и тогда она обрабатывается соответственно вложенности; и содержимое, выводимое из буфера нижнего уровня, будет включаться в буфер верхнего уровня. Не забывайте, что для вывода всего буферизированного содержимого необходимо вызвать функцию ob_end_flush() сколько же раз, сколько была вызвана ob_start().
<'php function c($str)
{ // получает содержимое буфера
return n!2br($str):
// возвращает содержимое буфера )
function d($str) j
// получает содержимое буфера
return strtoupper($str);
// возвращает содержимое буфера ?>
<?php ob_start("c"). ?>
Тут всякий текст...
<?php ob_start("d"):
/* преобразовывать текст далее
в верхний регистр */ ?>
и еще много чего .
<?php ob_end_flush(): ?>
смотрите сами ...
<?php ob_end_f)ush(): ?> ?>
См. также: ob_get_contents(), ob_end_f"lush(), ob_end_clean() и ob_implicit_ flush().
ob_get_contents
Получение содержимого буфера вывода
string ob_get_contents(void);
Если буферизация неактивна, возвращается FALSE.
См. также: ob_start() и ob_get_length().
ob_get_length
Получение длины данных в буфере вывода
string ob_get_length(vcrid);
Если буферизация неактивна, возвращается FALSE.
См. также: ob_start() и ob_get_contents().
ob_end_flush
Вывод содержимого буфера
void ob_end_flush(void);
После вывода буфер текущего уровня очищается, поэтому вызывайте функцию ob_get_contents() заранее, если необходимо получить его содержимое.
См. также: ob_start(), ob_get_contents() и ob_end_clean().
flush
Вывод всего содержимого буфера
void flush(void)
Функция воздействует только на буферизацию РНР и не может контролировать схему буферизации wcb-сервера или браузера.
, Некоторые серверы, в особенности под Win32, буферизируют выводящиеся сценарием данные до того, как сценарий завершится и данные будут отосланы браузеру.
Браузер, в свою очередь, также может буферизировать получаемые данные до их отображения. Netscape, например, буфсршируег текст до получения символа завершения строки или открывающего тега, а для таблиц — до получения тега </table> таблицы верхнего уровня.
ob_end_clean
Очистка буфера
void ob_end_clean(void);
Вызов функции отключает буферизацию на текущем уровне.
См. также: ob_start() и ob_end_flush().
ob_implicit_ flush
Установление режима буферизации
void objmplicit_flush (jjnt flag])
Если в аргументе указано ненулевое значение или оно не указано, то при осуществлении каждой операции вывода будет неявно вызываться функция flush().
При вызове функции неявно вызывается ob_end_f"lush().
См. также: flush(), ob_start() и ob_end_flush().
Использование интерфейса HTTP
Эти функции позволяют отсылать данные браузеру клиента непосредственно на уровне протокола HTTP.
headers_sent
Проверка отсылки заголовков
boolean headers sent (void)
Возвращает TRUE, если заголовки HTTP уже были отосланы; иначе — FALSE.
См. также header().

header
Посылка простого заголовка HTTP
int header (string string)
Функция используется в начале сценария HTML (до вывода прочего текста) для низкоуровневой посылки строк заголовков по протоколу HTTP. Спецификация заголовков HTTP 1.1 (http://www.w3.org/ Г Protocols/rfc2616/rfc2616) определяет их формат и назначение.
Не забывайте, что вывод может происходить также из вложенных файлов, если они были подключены директивой include() или с помощью параметра auto_prepend.
Наиболее общие варианты использования заголовков представлены ниже.
Переадресация. Если браузер получает заюлонок Location, то он пытается загрузить страницу с нового указанного адреса (сервер Apache при этом также получает код статуса REDIRECT).
<?php
header
("Location: http://www.p.net/new.php");
echo "Эта страница была перенесена
в другое место. Обновите ссылки.": exit;>
Выполнение команды HTTP/ (регистр не важен).
header ("HTTP/1.0 404 Not Found").
// страница не найдена
header ("HTTP/1.0 403 Forbidden"):
// доступ к этому адресу запрещен
Управление кэшированием (на браузере или прокси-сервере). Следующие четыре команды запрещают кэширование различными способами.
header ("Expires: Mon. 26 Jul
1988 05:00:00 GMT").
// Уже устаоело header
("Last-Modified- " . gmdateC'D. d M Y H:vs")
" GMT"):
// только что модифицировано
header ("Cache-Control: no-cache,
must-revalidate").
// HTTP/1.1 header ("Pragma: no-cache"):
// HTTP/1.0
См. также headers_sent().
HTTP-аутентификация в PHP
Осуществлять аутентификацию HTTP можно, только если PHP установлен как модуль web-сервера Apache. Для версии CGI и на других серверах (например, IIS) это невозможно. Аутентификация происходит путем посылки (с помощью функции Heatier()) заголовка Authentication Required, что заставляет браузер вывести окно для ввода имени пользователя и его пароля. После того как пользователь вводит эти данные, браузер заново запрашивает страницу, передавая серверу переменные $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE, соответственно со значениями имени пользователя, его пароля и метода аутентификации. В настоящее время поддерживается только аутентификация простого типа «Basic».
См. также функцию Header().
<?рhр if(hsset($PHP_
AUTH_USER)) { Header
C'WWW-Authenticate: Basic
rea)m=\"My RealmV"):
Header("HTTP/1.0 401
Unauthorized"): echo "Вы
отменили ввод
идентификационной информации.\n";
exit: } else { // здесь обычно
".роверяется имя пользователя
и пароль echo "Привет
$PHP_AUTH_USER.<P>";
echo "Вы вели пароль:
$PHP_AUTH_PW.<P>"; } ?>
Cookies
PHP полностью поддерживает cookies. Cookies — это механизм HTTP для сохранения информации о пользователе на его клиентской машине. Они работают следующим образом:

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

При получении cookies PHP преобразовывает их в переменные, как и переменные, полученные HTTP методами GET и POST (они также сохраняются в глобальном массиве $HTTP_COOKIE_VARS[]). Таким образом можно ассоциировать определенную информацию с конкретным пользователем (а реально его браузером) и передавать данные между страницам» одного сайта.
Например, так можно сохранять настройки пользователя для сайта или для электронных магазинов, информацию о том, что находится в «покупательской корзине» пользователя. В противном случае пришлось бы передавать всю эту информацию (часто достаточно объемную) в строке адреса URL. Имеется также альтернативный и часто более предпочтительный вариант — использование сессий (см. ниже).
Не забывайте, что cookies являются частью заголовков HTTP, и передавать их следует до того, как началась передача текста страницы (а также до того, как функцией header() будут посланы обычные заголовки). Таковы правила HTTP. Стоит отметить, что для одной страницы не может быть установлено более 20 cookies. А также, что значения cookies можно будет получить только при загрузке следующей страницы удалять cookies нужно с теми параметрами, с которыми они были созданы.
setcookie
Посылка cookie /
int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure])
Функция посылает переменную cookie в заголовке HTTP. Все аргументы, кроме имени name, необязательны (если какие-то указывать не требуется, то тогда их значением может быть пустая строка "" для строковых аргументов и 0 для числовых). Если у браузера уже имелся cookie с таким именем, он будет заменен новым.
В аргументе value можно указать значение, которое необходимо сохранить. Время, до которого браузер должен хранить у себя cookie, указывается в аргументе expire (в формате Unix time, возвращаемом функциями time() или mktirae()). Если в аргументе secure указывается ненулевое значение, то cookie будет передаваться в зашифрованном виде через протокол HTTPS.
В аргументах path и domain можно указать, страницам из каких каталогов какого домена необходимо возвращать значения cookies.
Следующие примеры устанавливают cookies:
setcookie ("TestCookiel". "Test Value"):
setcookie ("TestCooHeZ1 , $value.fime()+3GOO);
/* устаревает через час */ setcookie
("TestCook'eS". $value.time()+3600.
"/-rasmus/". " utoronto.ca". 1):
Удалить cookies из примера выше можно следующим образом:
setcookie ("TestCookiel"):
// set the expiration date to one hour ago
setcookie ("TestCookie2". "". timeO - 3600):
// время уже прошло
setcookie ("TestCookleS". "". timeO - 3600.
"/-nasmus/". " utoronto.ca". 1);
Можно сохранять в одном cookie одномерный массив (но устанавливать значение каждого элемента нужно по отдельности):
setcookie ("cookie[three]".
"cookie_three").
setcookie ("cookie[two]".
"cookie_two"): , setcookie
("coohe[one]". "cookie_one").
// проверим получение на
следующей странице ]
if (isset (Scookie)) { while
(list ($name. Svalue) = each ($cookie))
{ I echo "Sname == $vatue<br>\n": } }
Документацию Netscape, описывающую cookies, можно найти по адресу: http://www.netscape.com/newsref/std/cookie_spec.html
Microsoft Internet Explorer 4 (c Service Pack 1) некорректно работает с cookies, имеющими установленный третий параметр. Netscape Communicator 4.05 и Microsoft Internet Explorer 3.x некорректно работают с cookies с не установленными третьим и четвертым параметрами.


 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика