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

Статус
В этой теме нельзя размещать новые ответы.

omega

Создатель
Регистрация
21 Янв 2008
Сообщения
30
Реакции
10
Появилась необходимость работать через сокс-сервер в пхп. Насколько мне известно можно использовать curl, можно использовать готовые классы.
Насколько я понимаю Сurl работает только с сокс5, к тому же хотелось бы обойтись своим классом, без использования предустановленых библиотек (Не на каждом хостинге они есть).
Из готовых классов нашел
Попробовал, пример приведенный на странице - работает.
Однако если пытаюсь выполнить запрос
Код:
$sock->send("GET / HTTP/1.1\r\nConnection: close\r\n\r\n");
получаю ошибку чтения из сокс сервера.(В примере прописано HTTP/1.0:(
Error on reading data. Reason: Connection error
По исходнику не могу понять что может вызвать такую ошибку.
Подскажите кто сталкивался в чем может быть проблема, либо другой проверенный класс для этого.
 
Неважно 1/1 или 1/0. Сокс пропускает траф как есть. Видимо просто не работает сама сокс-прокся
 
И чем же твое использование класса отличается от примера?
В пример тот же запрос, и он как ты говоришь работает.
Может ты не учитываешь что после первого запроса соединение закрывается и его надо снова открывать, либо слать заголовок "Сonnection: keep-alive"
 
Действительно сокс пропускает любые протоколы без их модификации. Добавил "С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->_conn, 128)) === 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/1.0 нет Hostname Identification, что мне необходимо.
 
Нельзя 2 заголовка Connection
либо keep-alive либо close
Убери последний, а лучше замени в нем close на keep-alive

А так ли нужен Host в заголовках?
идентификазия имени апачем происзодится в процедуре соединения
$sock->connect("ya.ru:80", 10);
 
Нельзя 2 заголовка Connection
либо keep-alive либо close
Убери последний, а лучше замени в нем close на keep-alive
А так ли нужен Host в заголовках?
идентификазия имени апачем происзодится в процедуре соединения
$sock->connect("ya.ru:80", 10);
1. Убрал close, результат тотже :(
2. Т.е. если хостится несколько доменов и субдоменов на одном ипе, этого будет достаточно ? Как апачь узнает это имя ? Насколько я понимаю сдесь $sock->connect("ya.ru:80", 10); я.ру отрезолвится и конект пойдет просто на этот ип и вернется тот сайт который прописан дефолтом в апаче.
 
Попробуй в заголовках отправлять HTTP/1.0 (иногда возникают проблемы с версией 1.1)
 
Xel'[Naga] твой пост не понял, я вроде выше изложил почему я не могу использовать http/1.0
Итог: Методом проб и ошибок выяснил что ошибка была в неправильном http запросе. :)
К тому же я тестировал все на яндексе, а яндекс при неправильно сформированном запросе просто рвет соединение, из-за чего я и получал ошибку.
Для составления коректных запросов я использовал эти ресурсы:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху