Класс для работы с соксами

Тема в разделе "PHP", создана пользователем omega, 10 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. omega

    omega Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    30
    Симпатии:
    10
    Появилась необходимость работать через сокс-сервер в пхп. Насколько мне известно можно использовать curl, можно использовать готовые классы.
    Насколько я понимаю Сurl работает только с сокс5, к тому же хотелось бы обойтись своим классом, без использования предустановленых библиотек (Не на каждом хостинге они есть).
    Из готовых классов нашел http://forum.antichat.ru/nextoldesttothread57029.html
    Попробовал, пример приведенный на странице - работает.
    Однако если пытаюсь выполнить запрос
    Код:
    $sock->send("GET / HTTP/1.1\r\nConnection: close\r\n\r\n");
    получаю ошибку чтения из сокс сервера.(В примере прописано HTTP/1.0:(
    По исходнику не могу понять что может вызвать такую ошибку.
    Подскажите кто сталкивался в чем может быть проблема, либо другой проверенный класс для этого.
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Неважно 1/1 или 1/0. Сокс пропускает траф как есть. Видимо просто не работает сама сокс-прокся
     
  3. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    236
    Симпатии:
    60
    И чем же твое использование класса отличается от примера?
    В пример тот же запрос, и он как ты говоришь работает.
    Может ты не учитываешь что после первого запроса соединение закрывается и его надо снова открывать, либо слать заголовок "Сonnection: keep-alive"
     
  4. omega

    omega Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    30
    Симпатии:
    10
    Действительно сокс пропускает любые протоколы без их модификации. Добавил "Сonnection: keep-alive", теперь запрос выглядит следующим образом:
    PHP:
        $out "GET / HTTP/1.1\r\n";
        
    $out .= "Сonnection: keep-alive\r\n";
        
    $out .= "Host: ya.ru\r\n";
        
    $out .= "User-Agent: Mozilla/5.0 Firefox/2.0.0.7;\r\n";
        
    $out .= "Accept: text/xml,\r\n";
        
    $out .= "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
        
    $out .= "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
        
    $out .= "Connection: Close\r\n\r\n";
    Получаю как и раньше
    Код:
    Error on reading data. Reason: Connection error in /var/www/include/socket.class.php on line 171
    
    Это следующий код класса socket.class.php
    PHP:
            $str "";
            while(!
    feof($this->_conn))
            {
                if((
    $buf fgets($this->_conn128)) === FALSE)
                {
                    
    trigger_error("Error on reading data. Reason: Connection error"E_USER_WARNING);
                    return 
    false;
                }
                
    $str .= $buf;
            }
            return 
    $str;
    Сокс стопроцентно рабочий поскольку локальный.

    Причем как я уже писал, если закоментить строку $out .= "Host: ya.ru\r\n"; и поставить HTTP/1.0 все работает !

    Я бы использовал HTTP/1.0, но почитав http://www.apacheweek.com/features/http11 выяснил что в HTTP/1.0 нет Hostname Identification, что мне необходимо.
     
  5. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    236
    Симпатии:
    60
    Нельзя 2 заголовка Connection
    либо keep-alive либо close
    Убери последний, а лучше замени в нем close на keep-alive

    А так ли нужен Host в заголовках?
    идентификазия имени апачем происзодится в процедуре соединения
    $sock->connect("ya.ru:80", 10);
     
  6. omega

    omega Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    30
    Симпатии:
    10
    1. Убрал close, результат тотже :(
    2. Т.е. если хостится несколько доменов и субдоменов на одном ипе, этого будет достаточно ? Как апачь узнает это имя ? Насколько я понимаю сдесь $sock->connect("ya.ru:80", 10); я.ру отрезолвится и конект пойдет просто на этот ип и вернется тот сайт который прописан дефолтом в апаче.
     
  7. Xel'[Naga]

    Xel'[Naga] Писатель

    Регистр.:
    23 мар 2007
    Сообщения:
    9
    Симпатии:
    0
    Попробуй в заголовках отправлять HTTP/1.0 (иногда возникают проблемы с версией 1.1)
     
  8. omega

    omega Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    30
    Симпатии:
    10
    Xel'[Naga] твой пост не понял, я вроде выше изложил почему я не могу использовать http/1.0
    Итог: Методом проб и ошибок выяснил что ошибка была в неправильном http запросе. :)
    К тому же я тестировал все на яндексе, а яндекс при неправильно сформированном запросе просто рвет соединение, из-за чего я и получал ошибку.
    Для составления коректных запросов я использовал эти ресурсы:
    http://www.w3.org/Protocols/rfc2616/rfc2616.html
    http://www.explainth.at/en/misc/httpreq.shtml
     
Статус темы:
Закрыта.