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

•MX (по умолчанию)

•NS

•SOA

•PTR

•CNAME

•ANY

Аргумент host может указываться строкой в формате IP с разделением точками, либо быть именем хоста.

getmxrr

Производит получение MX записи для интернет-хоста.

Синтаксис :

int getmxrr(string hostname, array mxhosts [, array weight]);

Функция getmxrr() инициирует поиск в базе данных DNS записи MX (почтовый сервер домена) для хоста hostname.

Если запись найдена, возвращает true, если нет - то false.

Список записей MX заносится в массив mxhosts. Если указан массив weight, он заполняется дополнительной информацией о записях.

Отслеживание и обработка ошибок : Введение

PHP имеет следующие типы ошибок и предупреждений:

 

 

 

 

 

 

 

Значение

 

Константа

 

Описание

 

1

 

E_ERROR

 

Фатальная ошибка времени исполнения.

 

 

 

 

 

 

 

2

 

E_WARNING

 

Предупреждение времени исполнения.

 

 

 

 

 

 

 

4

 

E_PARSE

 

Сообщение интерпретации времени

 

 

 

исполнения.

 

 

 

 

 

 

 

 

 

 

 

 

8

 

E_NOTICE

 

Простое сообщение времени исполнения.

 

 

 

 

 

 

 

16

 

E_CORE_ERROR

 

Фатальная ошибка при инициализации PHP.

 

 

 

 

 

 

 

32

 

E_CORE_WARNING

 

Предупреждение инициализации.

 

 

 

 

 

 

 

64

 

E_COMPILE_ERROR

 

Фатальная ошибка компиляции.

 

 

 

 

 

128

 

E_COMPILE_WARNING Предупреждение компиляции.

 

 

 

 

 

 

 

256

 

E_USER_ERROR

 

Ошибки, определяемые пользователем.

 

 

 

 

 

 

 

512

 

E_USER_WARNING

 

Предупреждения, определяемые

 

 

 

пользователем.

 

 

 

 

 

 

 

 

 

 

 

 

1024

 

E_USER_NOTICE

 

Сообщения, определяемые пользователем.

 

 

 

 

 

 

 

2047

 

E_ALL

 

Все перечисленные сообщения.

 

 

 

 

 

 

Указанные значения в виде чисел или констант можно комбинировать, формируя битовую маску ошибок, о которых необходимо сообщать в ходе исполнения сценария. Для комбинирования используются битовые операторы, но в конфигурационном файле php.ini распознаются только "|", "~", "!" и "&".

В PHP 4 по умолчанию разрешены сообщения вида E_ALL & ~E_NOTICE, то есть

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

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

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

Если разрешен параметр конфигурации track_errors, то сообщение об ошибке сохраняется в глобальной переменной $php_errormsg.

<?

// определенный пользователем обработчик ошибок

function userErrorHandler($errno,$errmsg,$filename,$linenum,$vars) { // время возникновения ошибки

$dt=date("Y-m-d H:i:s (T)"); $errortype = 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.="тип ошибки (".$errortype[$errno]."): "; $err.="\"$errmsg\".файл \"$filename\", строка ("; $err.=$linenum.")\n";

$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); // не выводить сообщения PHP $old_error_handler=set_error_handler("userErrorHAndler");

//неопределенная константа вызывает предупреждение

$t=_NOT_DEFINED_CONSTANT;

trigger_error("Моя ошибка", E_USER_ERROR); trigger_error("Мое предупреждение", E_USER_WARNING);

?>

Отслеживание и обработка ошибок : Функции обработки ошибок

error_log

Посылка сообщения об ошибке.

Синтаксис :

int error_log(string message, int message_type [, string destination [, string extra_headers]])

Сообщение, посылаемое этой функцией, может быть направлено в журнал системных сообщений web-сервера, прот TCP или в файл.

В первом аргументе message указывается само содержание сообщения. Во втором аргументе message_type - куда оно должно быть направлено.

Назначение обозначается следующими значениями:

•0 - Сообщение заносится в системный журнал событий (файл) согласно установке параметра конфигурации error_log.

•1 - Сообщение отправляется по электронной почте, по адресу, указанному в аргументе destination. Это единственный тип сообщения, использующий четвертый параметр extra_headers, в котором можно указать дополнительные заголовки (как в функции mail()).

•2 - Сообщение посылается через подключение отладки. Это возможно только в случае, если параметр удаленной отладки был разрешен в файле конфигурации. Для этого также должен быть определен адрес хоста (имя или его IP адрес) и порт сокета, который будет принимать сообщения отладки. Это можно указать в аргументе destination или параметрах конфигурации.

•3 - message добавляется в конец файла destination.

if(!Ora_London($username, $password)) { error_log("Сервер Oracle недоступен!", 0);

};

if(!($foo = allocate_new_foo()) {

error_log("Нельзя выделить FOO!", 1, "operator@mydomain.ru");

}

// other ways of calling error_log(): error_log("У нас ошибка!", 2, "127.0.0.1:7000"); error_log("У нас ошибка!", 2, "localhost");

error_log("У нас ошибка!", 3, "/var/tmp/my-errors.log");

error_reporting

Установка видов сообщаемых ошибок.

Синтаксис :

int error_reporting([int level])

Функция error_reporting() возвращает предыдущую установку типа сообщаемых ошибок. Если указан аргумент, то заново переопределяет ее. В аргументе можно указывать константу, число или битовую маску. Старайтесь использовать константы вместо численных значений, чтобы сохранить совместимость с будущими версиями PHP.

error_reporting(2039); // в PHP эквивалент E_ALL ^ E_NOTICE error_reporting(E_ALL ^ E_NOTICE); // установка по умолчанию error_reporting(0); // отключить сообщения об ошибках

// общие ошибки выполнения error_reporting(E_ERROR | E_WARNING | E_PARSE); // также сообщать о неизвестных переменных

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); error_reporting(E_ALL); // сообщать все ошибки

restore_error_handler

Восстановление предыдущего обработчика ошибок.

Синтаксис :

void restore_error_handler()

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

trigger_error

Генерация ошибки.

Синтаксис :

void trigger_error(string error_msg [, int error_type])

Явно вызывает функцию, установленную для обработки ошибок, и обычно используется в паре с обработчиком ошибок. Функция способна генерировать только пользовательские типы ошибок ( семейство констант E_USER), и по умолчанию, если не указан тип ошибки error_type, он считается E_USER_NOTICE.

Возможно конструировать сложные конструкции генерации и обработки ошибок и исключительных ситуаций.

if(assert($divisor == 0))

trigger_error ("Нельзя делить на 0 ", E_USER_ERROR);

user_error

Синоним функции trigger_error().

Синтаксис :

void user_error(string error_msg [, int error_type])

Отслеживание и обработка ошибок : Установка пользовательского обработчика ошибок

set_error_handler

Установка пользовательского обработчика ошибок.

Синтаксис :

string set_error_handler(string error_handler)

Функция возвращает имя функции, ранее определенной в качестве обработчика ошибок (или FALSE при ошибке), и устанавливает, в качестве нового обработчика, функцию с указанным в аргументе error_handler именем.

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

Функция, устанавливаемая в качестве обработчика ошибок, должна принимать пять параметров (три последних являются дополнительными и могут не обрабатываться):

•код ошибки

•строку, описывающую ошибку

•имя сценария, в котором произошла ошибка

•номер строки сценария, содержащей ошибку

•контекст (массив, содержащий значения переменных, в момент возникновения ошибки)

<?

//определить константы пользовательских ошибок define(FATAL, E_USER_ERROR);

define(ERROR, E_USER_WARNING); define(WARNING, E_USER_NOTICE);

//установить, какие ошибки должны обрабатываться в сценарии error_reporting (FATAL | ERROR | WARNING);

//пользовательский обработчик ошибок

function myErrorHandler($errno,$errstr,$errfile,$errline) { switch ($errno) {

case FATAL:

echo "<b>Критическая ошибка</b> [$errno] $errstr<br>\n"; echo "в строке: $errline файла:".$errfile;

echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n"; echo "Aborting...<br>\n";

exit -1; break; case ERROR:

echo "<b>Ошибка</b> [$errno] $errstr<br>\n"; break;

case WARNING:

echo "<b>Предупреждение</b> [$errno] $errstr<br>\n"; break;

default:

echo "Неизвестный тип ошибки: [$errno] $errstr<br>\n";

}

}

//функция для проверки обработки ошибок

//(масштабирование массива

function scale_by_log($vect, $scale) { if(!is_numeric($scale) || $scale <= 0)

trigger_error("вычислить log(x) для x <= 0 нельзя. ", "(x = $scale)", FATAL);

if(!is_array($vect)) { trigger_error("Требуется массив ", ERROR); return null;

}

for($i=0; $i<count($vect); $i++) { if(!is_numeric($vect[$i]))

trigger_error("Элемент ($i) не число и

его значением считается 0", WARNING); $temp[$i]=log($scale)*$vect[$i];

}

return $temp;

}

// установить пользовательский обработчик ошибок $old_error_handler=set_error_handler("myErrorHandler");

$a=array(2,3,"foo",5.5,43.3,21.11); print_r($a);

$b=scale_by_log($a,M_PI); // здесь выдается предупреждение echo "Массив, масштабированный на логарифм(Пи): ";

print_r($b);

$c=scale_by_log("not array",2,3); // здесь ошибка var_dump($c);

$d=scale_by_log($a, -2.5); // здесь критическая ошибка

echo "Продолжение сценария..."; ?>

При выполнении сценария вывод будет следующим:

Array

(

[0]=> 2

[1]=> 3

[2]=> foo

[3]=> 5.5

[4]=> 43.3

[5]=> 21.11

)

<b>Предупреждение</b> [1024] Элемент (2) не число, и его значением считается 0<br>

Массив, масштабированный на логарифм(Пи): Array

(

[0]=> 2.2894597716988

[1]=> 3.4341896575482

[2]=> 0

[3]=> 6.2960143721717

[4]=> 49.566804057279

[5]=> 24.165247890281

)

<b>Ошибка</b> [512] Требуется массив <br> NULL

<b>Критическая ошибка</b> [256] вычислить log(x) для x <=0 нельзя, (x = -2.5)<br>

в строке: 37, файла E:\www\exampl.php, PHP 4.0.5 (WINNT)<br> Aborting...<br>

Не забывайте, что при установке пользовательского обработчика ошибок стандартный обработчик PHP не используется. Установки error_reporting() также не будут иметь эффекта, и пользовательский обработчик должен уметь обрабатывать все виды ошибок (значение error_reporting() можно выяснить и действовать соответсвенно). Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, вывод ошибок для которой был блокирован оператором "@".

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

Управление сессиями : Зачем нужны сессии.Механизм работы сессий

Зачем нужны сессии

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

В Web-программировании есть один класс задач, который может вызвать довольно много проблем, если писать сценарий "в лоб". Речь идет о слабой стороне CGI - невозможности запустить программу на длительное время, позволив ей при этом обмениваться данными с пользователями.

Представте, что мы пишем форму, но в ней такое большое число полей, что было бы глупо поместить их на одну страницу. Нам нужно разбить процесс заполнения формы на несколько этапов, или стадий, и представить их в виде отдельных HTML-документов.

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

Реализация такой схемы оказывается для Web-приложений довольно нетривиальной проблемой. Действительно, нам придется хранить все ранее введенные данные в каком-нибудь хранилище, которое должно аннулироваться, если пользователь вдруг передумает и уйдет с сайта. Для этого можно использовать функции сериализации и файлы. Однако ими мы решаем только половину проблемы: нам нужно как то привязать конкретного пользователя к конкретному временному хранилищу. Действительно, предположим, мы этого не сделали. Тогда, если в момент заполнения какой-нибудь формы одним пользователем на сайт зайдет другой и тоже попытается ввести свои данные, получится белеберда.

Все эти проблемы решаются при помощи сессий.

Механизм работы сессий

Для начала должен существовать механизм, который бы позволил PHP идентифицировать каждого пользователя, запустившего сценарий. То есть при следующем запуске PHP нужно однозначно определить, кто его запустил: тот же человек, или другой. Делается это путем присвоения клиенту так называемого уникального идентификатора сессии. Чтобы этот идентификатор был доступен при каждом запуске сценария, PHP помещает его Cookies браузера. Теперь, зная идентификатор (дальше SID), PHP может определить, в каком же файле на диске храняться данные пользователя.

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

Где же находиться то промежуточное хранилище, которое использует PHP? Вообще говоря, вы вольны сами это задать, написав соответствующие функции и зарегестрировав их как обработчики сессии. Впрочем, делать это не обязательно: в PHP уже существуют обработчики по умолчанию, которые хранят данные в файлах. Если вы не собираетесь создавать что-то особенное, вам они вполне подойдут.