If this is a first time you visiting Scrolls, please register in Fight Club. If you already registered, please authorize on Fight Club start page with your login and password.
Давным давно Alex Nomad [9]рассказывал о том, как правильно получать информацию о персонаже в и приводил пример обращения к страницам БК. Мне кажется, что уже давным давно пора начинать использовать ООП, котрое есть в пыхе и использовать православные методы.
Собственно преимущества кода, который я предлагаю: 1. Мы ограничиваем максимальное количество редиректов тремя. Это не даст возможность серверу БК зациклить наш скрипт. 2. Мы ограничиваем время доступа к странице 10 секундами (хотя даже 10 много, лучше 3-5), чтобы не тратить много времени на тормозящий сервер БК. 3. Получением данных занимается curl (редиректы, таймауты, правильное разархивация) 4. В результате работы, с помощью iconv, мы получаем нормальную UTF-8 строчку, с которой можем спокойно работать. Забудьте вы уже о win-1251 - это архаизм! Надо смотреть в будущее. 5. Ну и собственно мы получаем очень хорошие исключение на все ошибки, которые возникнут во время получения данных, которые можно будет отловить и как-то обработать.
Код модуля можно посмотреть под катом. Появившиеся вопросы можно оставить в комментах.
<?
/** .* Класс утилит для работы с БК .* .* @version 0.1 .* @author Eugene Reich <eugene.reich@gmail.com> .*/
class CombatsUtils { ..../** .... * Возвращает содержимое страницы в UTF-8 кодировке .... * Метод анализирует возвращаемые результаты и кидает соответствующие исключения .... * .... * @param string $url .... * @static .... * @access public .... * @return string .... */ .... ....static public function getUrl($url) ....{ ........$ch = curl_init(); ........ ........curl_setopt($ch, CURLOPT_URL, $url); ........curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); ........curl_setopt($ch, CURLOPT_HEADER, 0); ........curl_setopt($ch, CURLOPT_TIMEOUT, 10); ........curl_setopt($ch, CURLOPT_MAXREDIRS, 3); ........curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); ........curl_setopt($ch, CURLOPT_FAILONERROR, true); ........curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
class CombatsUtilsExceptionTimeout extends CombatsUtilsException {}
/** .* Не удалось установить соединение с сервером .* .* @uses CombatsUtilsException .* @version 0.1 .* @author Eugene Reich <eugene.reich@gmail.com> .*/
class CombatsUtilsExceptionConnection extends CombatsUtilsException {}
Следует добавить что данный код будет работать только в PHP версии 5.0 и выше. Начинание очень хорошее! Предвижу что в скором будущем автор захочет опубликовать код работы бота. По этому поводу хотелось бы предостеречь ибо это может привести к появлению огромного количества клановых сервисов с флудящими запросами к серверам БК. Предлагаю к таким публикациям относится очень осторожно, ибо судя по тем вопросам что мне иногда задают "клановые программисты" иногда волосы дыбом встают.
Полностью с Вами согласен. Выкладывать код бота сюда было бы глупо. Я лишь пытаюсь дать тем, кто хочет что-то сделать для БК в руки правильные функции, чтобы они не писали "быдлокод", а делали сразу правильно и пытались задуматься, почему я поставил указанные цифры и кинул исключения )
а после выполнения, просто проверять или вернуло какое-то значение.
да и работать в данном случае будет и в 4й версии
PS. и не надо забывать закрывать коннекшн
Гость БК
20-04-09 @ 18:40
Сделано это для следующих вариантов работы:
try { Combats::getUrl('http://...'); } catch(CombatsUtilsException $e) { //Выставить флаг о необходимости повторения запроса через 5 минут }
Также индивидуально можно проставить разное время в разных ситуациях + на мыло можно кидать лог с исключением, узнав когда и какое исключение произошло
Гость БК
23-05-09 @ 16:50
Непонятка(
Имею следущий код:
<? include_once("mysql.php");
class CURL { var $callback = false;
function setCallback($func_name) { $this->callback = $func_name; }
$login=$row->login; if (!array_key_exists("login_online", $ar_complete)) { mysql_query ("UPDATE `".ST_TABLE."` SET login_online='0' WHERE login='$login'") or die("update.php -> err ".mysql_error($LINK)."\n"); mysql_query ("UPDATE `".ST_TABLE."` SET room_name='' WHERE login='$login'") or die("update.php -> err ".mysql_error($LINK))."\n"; } foreach ($ar_complete as $key => $value) { //print_rf($ar_complete); //echo("UPDATE ".ST_TABLE." SET ".$key."='".$value."' WHERE login='$login'"); //exit; if (($row->key)!=$value) { //print_rf($row->$key); // print_rf($value); // print_rf ("UPDATE ".ST_TABLE." SET ".$key."=".$value." WHERE login=".$login."\n"); mysql_query ("UPDATE `".ST_TABLE."` SET ".$key."='".$value."' WHERE login='".$login."'") or die("update.php -> err ".mysql_error($LINK)."\n"); //exit; } } sleep (1); } mysql_free_result ($result); ?>
Обновляется 14 человек из 30 членов клана... Постоянно выдаёт:
Fatal error: Maximum execution time of 30 seconds exceeded in W:\home\knl\www\update.php on line 181
Гуру, помогие:)
Гость БК
26-05-09 @ 19:00
set_time_limit(0); И все станет норм. sleep лучше сделать в 3 секунды.
Vikis
26-05-09 @ 20:38
непонятка
Спасибо,всё работает:) Курл стал выдавать ошибки.... НО это уже мелочи. Видимо из-за кодировки win-1251