Управление исполнением сценария 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 при ошибке), указанного в первом аргументе одной из следующих констант:
Параметр | 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
Статус подключений
Внутренне РНР имеет три статуса подключения:
При нормальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажимает кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему времени (см. функцию set_tirae_ liraitO), устанавливается флаг состояния TIMEOUT. Возможно определить, как должен вести себя сценарий в зависимости от этих условий.
Если требуется, чтобы сценарий продолжал свое выполнение при разрыве соединения пользователем, нужно установить в файле конфигурации значение параметра ignore_user_abort = 1 (это также можно сделать в файлах конфигурации Apache). Можно также воспользоваться функцией ignore_user_abort(). В противном случае, но умолчанию, если браузер отказывается от приема данных сценария, сценарий завершается. < /FONT >
Чтобы игнорировать завершение сценария таймером, необходимо использовать функцию 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 символа). < /FONT>
Принято также дообрабатывать полученное значение криптографическими методами (например, это часто делается в идентификаторах сессий).
$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|
Допустимы следующие коды типов данных:
packC'h*"."0123456789abcDEF")
== «\xlO\x32\x54\x76\x98\xBA\xDC\xFE»
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)
pack("n*".OxF951.Oxlllllllll) == «\xF9\x51\xFF\xFF»
pack("v",OxF951) == «\x51\xF9»
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/.