Все ленты — последние статьи

Ограничение количества запросов с одного IP — изучить , переделать

Ограничение количества запросов с одного IP

Боты могут доставить много неприятностей, для борьбы с ними существуют различные способы. Не безызвестная каптча тому пример, но не всегда она применима. Одной из альтернатив, является ограничение количества запросов за период времени. Разумно подобрав параметры вы не создадите неудобств вашим посетителям, при этом создав огромные проблемы боту.

Этот сниппет использует базу данных для хранения записей о попытках запроса:

1
2
3
4
5
6
7
8
9
10
11
--
-- Структура таблицы `check_ip`
--
CREATE TABLE IF NOT EXISTS `check_ip` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` bigint(11) NOT NULL,
  `cnt` int(11) NOT NULL DEFAULT '0',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `ip` (`ip`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

А вот собственно и сама реализация:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
$dbuser='dbuser'//Пользователь базы данных
$dbpass='dbpass'//Пароль пользователя базы данных
$db='db'; //Имя базы данных
$try_count=3; //Лимиты попыток
$try_time=60; //Период лимита попыток в секундах
 
try {
    //Подключение к БД
    $mysqli = new mysqli("localhost", $dbuser, $dbpass, $db);
    if ($mysqli->connect_errno) {
        throw new Exception('Не удалось подключиться к БД');
    }
    //Определяем IP адрес
    $ip=$_SERVER['REMOTE_ADDR'];
    $long = ip2long($ip);
    if ($long == -1 || $long === FALSE) {
        throw new Exception('Ошибка определения IP');
    }
    //Подготавливаем данные для запросов
    $long = sprintf('%u', $long);
    $time=date('Y-m-d H:i:s',time()-$try_time);
    //Ищем запись о попытках подключения
    $res = $mysqli->query("SELECT `id`,`cnt` FROM `check_ip` where `ip`='$long' and `date`>='$time'");
    if ($res->num_rows>0){
        $row = $res->fetch_assoc();
        if ($row['cnt']>=$try_count){
            throw new Exception('Превышено количество попыток, повторите запрос через 1-2 минуты');
        }else{
            //Увеличиваем счетчик попыток
            $mysqli->query("update `check_ip` set `cnt`=`cnt`+1 where `id`='{$row['id']}'");
        }
    }else{
        //Вставляем запись о попытка запроса
        $time=date('Y-m-d H:i:s',time());
        $mysqli->query("INSERT INTO `check_ip` ( `ip`, `cnt`, `date`) VALUES ('$long', 1, '$time')");
    }
    /*
        Здесь выполняем полезные действия
    */
    echo "Ok";
} catch ( Exception $e ) {
    //Обработка ошибочных ситуаций
    echo $e->getMessage();
}

Код довольно простой и комментированный, если будут вопросы не стесняйтесь. По мере возможностей постараюсь ответить всем.

Получить информацию об использовании памяти

Получить информацию об использовании памяти

Оптимизируя сценарии, необходимо знать какой объем оперативной памяти потребляет сценарий. Этот пример показывает как узнать начальный и конечный объем выделения памяти, а также максимальный объем выделеной памяти.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
echo "Начальный: ".memory_get_usage()." bytes \n";
 
// выделяем память
for ($i = 0; $i < 100000; $i++) {
  $array []= md5($i);
}
// освобождаем память
for ($i = 0; $i < 100000; $i++) {
  unset($array[$i]);
}
 
echo "Конечный: ".memory_get_usage()." bytes \n";
 
echo "Максимальный: ".memory_get_peak_usage()." bytes \n";

Кириллица и регулярные выражения — вырезаем спец символы и лишнее

Заменяем все символы кроме букв (в том числе и кириллица) и цифр на пустоту, т.е. удаляем символы, которые не подходят:

$str = "Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7 :)";
$str = preg_replace('/[^\w_]+/u', '', $str);
// результат: IntelустанавливаетвсвоихофисахкофеиколаавтоматынаплатформеCorei7

Разрешаем символ пробела (\s):

$str = "Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7 :)";
$str = preg_replace('/[^\w_\s]+/u', '', $str);
// результат: Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7

Source


Определить кооридинаты по адресу через API Яндекс.Карты

на главную http://soscode.ru<br/ >

$adress = urlencode("Москва, Тверская+улица, дом 7");
$url = "http://geocode-maps.yandex.ru/1.x/?geocode={$adress}";
$content = file_get_contents($url);
preg_match("/<pos>(.*?)<\/pos>/", $content, $point);
$coords = str_replace(' ', ', ', trim(strip_tags($point[1])));
echo $coords;
// результат: 38.241803, 56.300984

API Яндекс.Карты | Source


=== c YANDEX === https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/input_params-docpage/

Параметры HTTP-запроса

Запрос к геокодеру представляет собой обращение по протоколу HTTPS к URL https://geocode-maps.yandex.ru/1.x/.

Например, для того чтобы определить координаты здания по адресу "ул. Тверская, дом 7" (здание Центрального Телеграфа в Москве), можно выполнить следующий запрос:

 

https://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская+улица,+дом+7

 

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

При обратном геокодировании в запросе указываются координаты искомого объекта, а в ответе будет возвращен его адрес.

Ниже в таблице приведен список параметров HTTP-запроса:

ПараметрОписаниеПример
Обязательные параметры
geocode

Адрес либо географические координаты искомого объекта.

Координаты могут быть заданы в одном из следующих форматов.

Прямое геокодирование:

geocode=Москва,+Тверская+улица,+дом+7

Обратное геокодирование:

geocode=37.611,55.758

apikey

Ключ, полученный в кабинете разработчика. Используется только в платной версии API.

apikey=Ahdb3kz…

Необязательные параметры
sco Порядок задания координат (только для обратного геокодирования). Возможные значения:
  • longlat — долгота, широта (по умолчанию);
  • latlong — широта, долгота.

Независимо от значения этого параметра в ответе геокодера координаты всегда будут возвращаться в последовательности «долгота широта».

Обратное геокодирование:

sco=latlong

kind Вид топонима (только для обратного геокодирования).

Список допустимых значений:

  • house — дом;
  • street — улица;
  • metro — станция метро;
  • district — район города;
  • locality — населенный пункт (город/поселок/деревня/село/…).

 

Обратное геокодирование:

kind=street

format

Требуемый формат ответа геокодера:

 

  • xml — результат возвращается в виде YMapsML-документа;
  • json — результат возвращается в формате JSON.

 

Значение по умолчанию: xml.

format=json
callback

Имя JavaScript-функции, которой передается ответ геокодера (в соответствии с соглашениями JSONP).

Параметр учитывается только в том случае, если ответ возвращается в формате JSON.

callback=my_response_handler
ll,spn

Географическая область поиска объекта.

Поиск может быть как ограничен данной областью, так и не ограничен (в зависимости от значения параметра rspn
[no-highlight[

Описание

Позволяет ограничить поиск объектов областью, заданной с помощью параметров ll и spn. Возможные значения:

  • 0 — не ограничивать поиск (по умолчанию),
  • 1 — ограничить.

Пример

rspn=1]no-highlight]
). В последнем случае использование параметров ll и spn влияет лишь на порядок выдачи результата: объекты, находящиеся в данной области, являются приоритетными.

Формат записи

Параметр ll задаёт долготу и широту центра области (в градусах), а spn — её протяженность (в градусах).

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

Обратное геокодирование

При обратном геокодировании параметр ll игнорируется, а spn учитывается, только если параметр kind принимает одно из следующих значений: house, street, locality или metro.

Прямое геокодирование:

ll=37.618920,55.756994&spn=0.552069,0.400552

Обратное геокодирование:

spn=0.552069,0.400552&kind=street
rspn

Позволяет ограничить поиск объектов областью, заданной с помощью параметров ll и spn. Возможные значения:

  • 0 — не ограничивать поиск (по умолчанию),
  • 1 — ограничить.
rspn=1
results

Максимальное количество возвращаемых объектов.

Значение по умолчанию: 10.

results=5
skip Количество объектов в ответе (начиная с первого), которое необходимо пропустить. Значение по умолчанию: 0. skip=3
lang

Локаль.

Формат записи

lang=language_region, где

  • language — двузначный код языка. Указывается в формате ISO 639-1.
  • region — двузначный код страны. Указывается в формате ISO 3166-1.

 

Список поддерживаемых значений:

  • ru_RU — русский (по умолчанию);
  • uk_UA — украинский;
  • be_BY — белорусский;
  • en_US — американский английский;
  • tr_TR — турецкий (только для карты Турции).
lang=en_US

key

Ключ API Яндекс.Карт. Используется в бесплатной версии API.

 

Ограничение. Если параметр key не передан, то поиск доступен только для следующих стран: Россия, Украина, Беларусь, Казахстан, Грузия, Абхазия, Южная Осетия, Армения, Азербайджан, Молдавия, Туркмения, Таджикистан, Узбекистан, Киргизия и Турция.

 

key=Av4tdh…

Форматы записи географических координат

В HTTP-запросе к геокодеру географические координаты задаются параметром geocode. Значения координат указываются последовательно и разделяются пробелом, запятой или точкой с запятой. При этом слева и справа от символов-разделителей допускается произвольное количество пробелов.

Примечание. Символ ";" нужно передавать в закодированном виде "%3B".

 

Для обозначения знака координат используются либо символы "+" и "-", либо буквы, определяющие соответствующие полушария Земли (использование символа "+" является необязательным). Например, для обозначения положительных координат используются N (северная широта) и E (восточная долгота), а отрицательных — W (западная долгота) и S (южная широта).

Знаки координат могут быть обозначены также и русскими буквами (С, В, З, Ю либо "с.ш.", "в.д.", "з.д." и "ю.ш." соответственно).

Буквы могут быть указаны как перед координатами, так и после: "В37.6176, С55.755" или "37.6176В, 55.755С". Также буквы могут отделяться пробелом: "В 37.6176, С 55.755".

Пример запроса для обратного геокодирования:

https://geocode-maps.yandex.ru/1.x/?geocode=E134.854,S25.828

 

Ниже приведен список допустимых форматов записи географических координат:
Формат записиПорядок следования координатПример
+-float, +-float Долгота, широта 134.854, -25.828
float [direction] *
[no-highlight[

* [direction] — буквенное обозначение одного из четырех направлений: N, E, W, S или С, В, З, Ю, либо “с.ш.“, “в.д.“, “з.д.“ и “ю.ш.“.

]no-highlight]
, float [direction]
Любой E134.854, S25.828

134.854E, 25.828S

134.854в.д, 25.828ю.ш.

+-deg° mm' ss", +-deg° mm' ss" Широта, долгота -25°49′41.1″, 134°51′15.88″
deg° mm' ss" [direction], deg° mm' ss" [direction] Любой 25°49′41.1″S, 134°51′15.88″E
NMEA Любой 2549.67,S, 13451.26,E

* [direction] — буквенное обозначение одного из четырех направлений: N, E, W, S или С, В, З, Ю, либо "с.ш.", "в.д.", "з.д." и "ю.ш.".

Геокодер возвращает заданные координаты в элементе metaDataProperty/GeocoderResponseMetaData/Point/pos в формате "[долгота] [широта]":

<metaDataProperty>
<GeocoderResponseMetaData>
<request>E134.854,S25.828</request>
<found>1</found>
<results>10</results>
<Point>
<pos>134.854412 -25.828084</pos>
</Point>
</GeocoderResponseMetaData>
</metaDataProperty>

 

Получаем исходный код любой веб-страницы для парсера

$lines = file('http://soscode.ru');
foreach ($lines as $line_num => $line) {     
    echo "Line #{$line_num} : ".htmlspecialchars($line)." <br/>";
}