Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Помогите найти ошибку в классе, Сокет-запросы повторяются несколько раз
Faantoom  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 102
Пользователь №: 24799
На форуме: 6 лет, 8 месяцев, 15 дней
Карма: 2




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

Свернутый текст
<?php
class
Chatovod {
// Настройки
public $host = 'demo.chatovod.ru';
public $chatId = '1';
// Внутренние переменные
private $cookies;
private $connection;
private $connected = false;
private $logged = false;
// Функция установки параметров
function setup($chatId = null, $host = null){
// Если параметры не пусты, устанавливаем их
if($chatId != null) $this->chatId = $chatId;
if($host != null) $this->host = $host;
}
// Функция соединения
function connect(){
// Если соедниение уже установлено, разрываем
if($this->connected) $this->disconnect();
// Устанавливаем соединение
$this->connection = @fsockopen($this->host, 80, $errno, $errstr, 10);
// Если возникла ошибка
if(!$this->connection){
// Выводим сообщение
echo $errstr.'('.$errno.')';
// Прерываем функцию
return false;
}
// Устанавливаем флаг активности
$this->connected = true;
}
// Функция авторизации
function login($nickname, $password){
// Если пользователь уже залогинен, прерываем функцию
if($this->logged) return true;
// Формируем данные
$data = "act=login&bind=0&chat=" . $this->chatId .
"&msg=" . urlencode($nickname) . "&pass=" . $password . "&pv=0&remember=0";
// Выполняем запрос
if($this->sendRequest("/ajax/", $data)){
$cookies = '';
// Читаем данные построчно
while(!feof($this->connection)){
// Текущая строка
$string = fgets($this->connection);
// Если это cookies
if(substr($string, 0, 11) == 'Set-Cookie:')
// Дописываем их в переменную
$cookies .= substr($string, 11);
}
// Устанавливаем флаг авторизации
$this->logged = true;
// Закрываем соединение
$this->disconnect();
// Удаляем из строки cookies переносы
$cookies = str_replace("\n", ";", str_replace("\r", " ", $cookies));
// Сохраняем cookies в настройки
if(!empty($cookies)) $this->cookies = $cookies;
return true;
}
return false;
}
// Функция отправки сообщений
function send($message){
// Прерываем функцию если сообщение не введено
if(empty($message)) return false;
// Если пользователь не залогинен, прерываем функцию
if(!$this->logged) return false;
// Формируем данные
$data = "act=send&chat=" . $this->chatId . "&channel=main&pv=0&msg=" . urlencode($message);
// Выполняем запрос
if($this->sendRequest("/ajax/", $data)){
// Закрываем соединение
$this->disconnect();
return true;
}
return false;
}
// Функция выхода из чата
function logout(){
// Если пользователь не залогинен, прерываем функцию
if(!$this->logged) return true;
// Формируем данные
$data = "act=leave&chat=" . $this->chatId;
// Выполняем запрос
if($this->sendRequest("/ajax/", $data)){
// Сбрасываем флаг авторизации
$this->logged = false;
// Закрываем соединение
$this->disconnect();
return true;
}
return false;
}
function disconnect(){
// Если соединение и так не установлено, прерываем функцию
if(!$this->connected) return false;
// Закрываем сокет
fclose($this->connection);
// Сбрасываем флаг активного соединения
$this->connected = false;
}
private function sendRequest($url, $data){
// Если данные не переданы, прерываем функцию
if(empty($url) || empty($data)) return false;
// Формируем POST-запрос
$request = "POST " . $url . " HTTP/1.1\r\n" .
"Host: " . $this->host . "\r\n";
if(!empty($this->cookies))
$request.= "Cookie: " . $this->cookies . "\r\n";
$request.= "Content-Type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($data) . "\r\n" .
"Connection: close\r\n\r\n" .
$data;
// Устанавливаем соединение
$this->connect();
// Записываем запрос в сокет
fputs($this->connection, $request);
// Выводим сообщение, что выполнялся запрос
echo 'Sended<br />';
return true;
}
}

И вызов:
<?php
// Создаем экземпляр
$chat = new Chatovod;
// Устанавливаем целевой чат
$chat->setup("86272", "sdawad.chatovod.ru");
// Подключаемся с имеющимся аккаунтом
$chat->login("awifas123", "qazwsx123");
// Отправляем сообщение
$chat->send("Test message");
// Отключаемся
$chat->logout();

Подскажите пожалуйста, в чем я тут прокололся?
Заранее прошу прощения, если код выглядит безграмотным, с классами ранее не работал вообще user posted image



Спустя 14 минут, 58 секунд (2.05.2012 - 20:39) Invis1ble написал(а):
Причина скорее всего не в представленном коде, по крайней мере я ничего подозрительного не вижу. Правда с сокетами давно работал, но вроде все правильно.

Спустя 6 минут, 37 секунд (2.05.2012 - 20:46) Faantoom написал(а):
Invis1ble, а в чем она может быть? Кроме этого кода больше ничего нет.
Может что-то не так в настройке сервера? А то уже весь день бьюсь, все запросы повторяются подряд трижды, так как будто вызов класса находится в цикле.

Спустя 11 минут, 31 секунда (2.05.2012 - 20:57) Invis1ble написал(а):
Faantoom
С чего ты взял что каждый запрос трижды? Я сейчас протестировал у себя - всё норм работает.
Посмотри в чат, я там время специально подставил в сообщения, чтоб видно было.

Спустя 2 минуты, 54 секунды (2.05.2012 - 21:00) Invis1ble написал(а):
А вот вывод скрипта, если немного видоизменить один из методов для наглядности:
    private function sendRequest($url, $data){
// Если данные не переданы, прерываем функцию
if(empty($url) || empty($data)) return false;
// Формируем POST-запрос
$request = "POST " . $url . " HTTP/1.1\r\n" .
"Host: " . $this->host . "\r\n";
if(!empty($this->cookies))
$request.= "Cookie: " . $this->cookies . "\r\n";
$request.= "Content-Type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($data) . "\r\n" .
"Connection: close\r\n\r\n" .
$data;
// Устанавливаем соединение
$this->connect();
// Записываем запрос в сокет
fputs($this->connection, $request);
// Выводим сообщение, что выполнялся запрос
echo $url, $data, '<br />';
return true;
}

Цитата
/ajax/act=login&bind=0&chat=86272&msg=awifas123&pass=qazwsx123&pv=0&remember=0
/ajax/act=send&chat=86272&channel=main&pv=0&msg=Test+message+%28from+phpforum+test+at+02.05.2012+21%3A56%3A56%29
/ajax/act=leave&chat=86272

Спустя 5 минут, 1 секунда (2.05.2012 - 21:05) Faantoom написал(а):
Блин, капец странное что-то творится...
Опять попробовал у себя...
В выводе отображено 3 запроса, но в чате выполнилось 9 действий...

Спустя 2 минуты, 14 секунд (2.05.2012 - 21:07) Invis1ble написал(а):
Ты уверен, что это ВЕСЬ твой код?
Накрайняк попробуй в другом браузере, хотя это врядли что-то изменит...



Спустя 1 минута, 32 секунды Invis1ble написал(а):
И я вижу не 9, а 4 действия
Цитата
22:03:00К нам присоединяется awifas123
22:03:00awifas123: Message
22:03:00Нас покидает awifas123
22:03:00Нас покидает awifas123

Может сам чат глюченый?



Спустя 3 минуты, 57 секунд Invis1ble написал(а):
а если учитывать 59-ю секунду - то 7
Отправляй не "Test message" а "Test message " . microtime(true), чтоб не было путанницы

Спустя 6 минут, 57 секунд (2.05.2012 - 21:14) Faantoom написал(а):
Офигеть... Я глубоко шокирован. Действительно браузер. Данная трабла происходит только при входе с Google Chrome ohmy.gif Вот и почему, спрашивается? blink.gif

Спустя 1 минута, 11 секунд (2.05.2012 - 21:16) Invis1ble написал(а):
Хз, я с хрома тестил тоже
С куками может баг в чате какой-то.

Спустя 2 минуты, 48 секунд (2.05.2012 - 21:18) Faantoom написал(а):
Хмм... Ну значит буду считать, что это трабла моего браузера, а скрипт рабочий smile.gif
Большое спасибо))
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса