Информационные технологииStfw.Ru 🔍

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

Управляющие функции
🕛 01.11.2006, 13:37
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 при ошибке), указанного в первом аргументе одной из следующих констант:

Параметр ini-параметр Умолчание Описание
ASSERT_ACTIVE asscrt.active. 1 Разрешить указание кода в assertQ
ASSERT_WARNING assert, warning 1 Выдавать предупреждение РПР
ASSERTJ3AIL assert.bail 0 Завершать выполнение, если «неистинно»
ASSERT_QUIET_EVAL assert.quiet_eval 0 Не выдавать сообщений
ASSERT_CALLBACK assert_callback (null) Установить функцию в качестве обработчика «неистинных» assert()

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

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   Теги:

Читать IT-новости в Telegram

Читайте также:

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

Информационные технологии
Мы в соцсетях ✉