![]() |
Показаны 8 сообщений на этой странице |
Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- "Сказка про PHP скрипт" или "как оно работает". (http://netadmin.ws/forum/showthread.php?threadid=2328)
"Сказка про PHP скрипт" или "как оно работает".
quote:
Предисловие:
сижу вобщем, рисую блок схемы работы web-приложений и тут мне приходит в голову что все можно описать гораздо проще...
..и без всяких трудных терминов. Об этом и сказка. :)
__________________
FAQ OFF
SCHIZO прикольно очень но помоему луще такие сказки в флейм писать 
неее во флейм не надо... я скоро схему с примером накалякаю, сюда же постить буду...
накалякал немного..
вот к примеру возьмем самый первый эпизод когда он встает до момента когда определяется
т.е.
при вызове, происходит инициализация параметров выполнения(конфиг, настройки и др.), затем смотрим, что имеем и где находимся.
теперь принимаем решение:
можем ли продолжать выполнение в таких условиях или нет, если не можем пытаемся исправить и снова смотрим можем или нет...
это упрощенная схема, есть ньюансы...
казалось бы просто, а это в среднем от 50 и более строк кода только на обеспечение корректной инициализации средненького web-приложения на PHP....
P.S.
рабочий пример еще не доделал, что-то уже спать охота....
продолжение следует...
__________________
FAQ OFF
вот так по моему мнению может выглядет этап инициализации...
<?php
// устанавливаем максимальный уровень сообщений об ошибках для отладки
error_reporting(E_ALL);
# все что ниже прототип кода который можно использовать
# при инициализации скрипта
/**
* константы для индексов массива параметров
* (мне так удобнее, чем обращение по числовому индексу)
*/
define('ASIS', 1);
define('NEED', 2);
define('FIXIT',3);
define('EMSG', 4);
define('ETYPE',5);
/**
* определение настроек из переданного массива параметров
* возвращает TRUE при успешной установке или соответствии всех параметров
* возвращает FALSE при количестве ошибок более нуля
*/
function setConfig($conf)
{
// инициализируем количество ошибок
$errors = 0;
// вычисляем сколько всего параметров
$items = sizeof($conf);
// проходим в цикле по списку параметров
for ($i = 0; $i < $items; $i++) {
// если действительное и желаемое не совпадают
if (eval($conf[$i][ASIS]) != $conf[$i][NEED]) {
// попробовать исправить
eval($conf[$i][FIXIT]);
// если действительное и желаемое не совпадают после попытки исправления
if (eval($conf[$i][ASIS]) != $conf[$i][NEED]) {
// вызвать ошибку с определенным типом и сообщением
user_error($conf[$i][EMSG],$conf[$i][ETYPE]);
// увеличить счетчик ошибок на единицу
$errors++;
}
}
}
// если ошибок нет
if (!$errors) {
// возвращаем TRUE
return TRUE;
}
// в любом другом случае
else {
// возвращаем FALSE
return FALSE;
}
}
/* конфигурация одной опции (для примера) */
// как узнать текущее значение параметра?
$conf[0][ASIS] = "return file_exists('php_data_file.txt');";
// каким должен быть параметр?
$conf[0][NEED] = TRUE;
// как это следует исправлять? -> если действительное и желаемое не совпадают
$conf[0][FIXIT] = "touch('php_data_file.txt');";
// сообщение об ошибке -> если не удалось исправить
$conf[0][EMSG] = 'File php_data_file.txt is not exists!';
// тип ошибки -> если не удалось исправить
$conf[0][ETYPE] = E_USER_WARNING;
/* тестируем... (как работает команда touch() в виндах, я не пробовал!) */
if (setConfig($conf)) {
echo 'Успешно';
}
else {
echo 'Неудачно';
}
?>
__________________
FAQ OFF
....блин, а все оказывается гораздо проще =)
вместо того чтобы проверять что либо по ходу скрипта, можно собрать в один массив и затем сравнить требуемое и какое есть.
Содержимое массива проще контролировать чем лазить по скрипту в полторы тысячи строк и искать момент проверки =)
функции должен передаваться двухмерный массив в подмассиве всего два элемента результат проверки и то каким он должен быть
если написать что то типа:
$arr[0][CHECK] = is_string($val);
function is_valid($params)
{
// вычисляем сколько всего параметров
$items = sizeof($params);
// проходим в цикле по списку параметров
for ($i = 0; $i < $items; $i++) {
// если действительное и требуемое не совпадают сказать НЕТ
if ($params[$i][CHECK] != $params[$i][NEED]) return FALSE;
}
// если цикл успешно завершился можем сказать ДА
return TRUE;
}
__________________
FAQ OFF
А если вдруг завтра война?
Итак, идентификация. По русски - "мы узнали кто к нам обратился".
Есть три традиционных подхода:
- что из себя представляет объект;
- чем объект владеет;
- что объект знает.
Самый простой способ идентифицировать - по IP адресу(что из себя представляет). Наиболе часто применяется в возможности бана по определенному IP. Как же определить забанен IP или нет?
Первое что приходит на ум, хранить забаненые айпишники в одномерном массиве, а при обращении проверять есть ли в массиве забаненых адресов адрес клиента. Ð_то достаточно просто сделать с помощью функции in_array() Передается массив(банлист) и искомое значение, если оно есть в массиве, функция вернет TRUE. Ð_тот метод работает отлично до определенной критической точки. Его можно использовать если у вас мало обращений и народ не очень буйный. А что делать если завтра война? =) флуд, DoS атаки и им подобные вещи?
Для этого случая есть немного другой подход: проверять по номерам сетей вплоть до адреса хоста. Для того, что бы это сделать требуется четырехмерный массив древовидной структуры типа такого:
$banlist[32][40][37][23];
$banlist[32][40][37][28];
$banlist[19][78][23][45];
$banlist[16][64][29][67];
// к примеру - первая запись банлиста
$ip[0] = 32;
$ip[1] = 40;
$ip[2] = 37;
$ip[3] = 23;
function is_banned($ip,$banlist)
{
if (!empty($banlist[$ip[0]])) // n.*.*.*
{
if (!empty($banlist[$ip[0]][$ip[1]])) // n.n.*.*
{
if (!empty($banlist[$ip[0]][$ip[1]][$ip[2]])) // n.n.n.*
{
if (!empty($banlist[$ip[0]][$ip[1]][$ip[2]][$ip[3]]))
// n.n.n.n
{
return TRUE;
}
}
}
}
return FALSE;
}
$ip_1 = array();
$ip_2 = array();
$ip_3 = array();
$ip_4 = array();
for($i=1; $i<=254; $i++) $ip_1[$i] = $i;
for($i=1; $i<=254; $i++) $ip_2[$i] = $ip_1;
for($i=1; $i<=254; $i++) $ip_3[$i] = $ip_2;
for($i=1; $i<=254; $i++) $ip_4[$i] = $ip_3;
// теперь массив $ip_4 содержит все варианты IP адресов
$banned[0] = array_rand($ip_1);
$banned[1] = array_rand($ip_1);
$banned[2] = array_rand($ip_1);
$banned[3] = array_rand($ip_1);
// а чейчас у нас есть случайно сгенерированный IP
// котрый ессесно забанен =)
//--------------------
$s = gettimeofday();
//--------------------
for($i=1; $i<=100000; $i++) is_banned($ip,$banlist);
//--------------------
$e = gettimeofday();
//--------------------
$a = $s['sec'].'.'.$s['usec'];
$b = $e['sec'].'.'.$e['usec'];
$a = (double) $a;
$b = (double) $b;
$f = $b - $a;
echo 'Время поиска: '.number_format($f,8).' секунд<br>';
echo 'Количество забаненых IP адресов: '. ((253*253)*253)*253;
$all_ip = ((253*253)*253)*253;
// создаем массив из диапазона чисел...
$ipls = range(1,$all_ip);
// соответственно как будто IP...
$banned = array_rand($ipls);
__________________
FAQ OFF
Ты крут.
Benjamin - не пугайся, есть в тыщу раз круче, я еще до среднего уровня не вырос =)
__________________
FAQ OFF
| Формат времени GMT. Текущее время 03:18. | Показаны 8 сообщений на этой странице |
Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.