Выход из локалки в инет через проксю

Тема в разделе "PHP", создана пользователем dino, 19 янв 2010.

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

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Господа есть проблемка следующего характера:
    Есть локальная сетка, есть сервер с сайтом и выходом в инет через проксю (скажем у сервака IP - 10.10.10.10 порт 8080) нужен способ вытягивать для внутреннего сайта из нета некоторую инфу (погода, новости и т.д.)
    при использовании кода:
    PHP:
    $proxy "10.10.10.10"
    $port 8080
    $url "http://lenta.ru/r/illustrated.html";
    $fp = @fsockopen($proxy$port$errno$errstr10); 
    @
    fwrite($fp"GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n");
    while(!@
    feof($fp)){ 
      
    $line = @fgets($fp10024); 
      print(
    $line); 

    fclose($fp); 
    инфа выдаётся, но при этом вначале отображается масса лишней служебной инфы типа
    Код:
    HTTP/1.0 200 OK Date: Tue, 19 Jan 2010 07:01:37 GMT Server: Apache Last-Modified: Tue, 19 Jan 2010 07:00:01 GMT 
    ETag: "202536-232fc-47d7f04c23e40" Accept-Ranges: bytes Content-Length: 144124 Vary: Accept-Encoding 
    Content-Type: text/html; charset=windows-1251 X-Cache: MISS from sin.gov.ua X-Cache-Lookup: MISS from sin.gov.ua:8080 
    X-Cache: MISS from mail-odes.gov.ua X-Cache-Lookup: HIT from mail-odes.gov.ua:8080 Proxy-Connection: close 
    что очень неудобно
    Огромная просьба описать какие ещё есть способы выхода в инет через проксю... Заранее всем спасибо!
     
  2. Mongolor

    Mongolor

    Регистр.:
    5 дек 2007
    Сообщения:
    157
    Симпатии:
    29
    PHP:

    //Использование функции
    get("http://lenta.ru/r/illustrated.html""10.10.10.10:8080");

    function 
    get($url,$proxy)
        {
           
    $ch curl_init($url);
           
    curl_setopt($chCURLOPT_USERAGENT"Opera/9.80 (Windows NT 5.1; U; MRA 5.4 (build 02652); ru) Presto/2.2.15 Version/10.00");
           
    curl_setopt($chCURLOPT_COOKIEJAR"./cook");
           
    curl_setopt($chCURLOPT_COOKIEFILE"./cook");
           
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
           
    curl_setopt($chCURLOPT_TIMEOUT10);  
           
    curl_setopt($chCURLOPT_PROXY$proxy);
           
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
           
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
           
    $result  curl_exec($ch);
           
    curl_close$ch );
           return 
    $result;
        }

     
    dino нравится это.
  3. Abliganto

    Abliganto Постоялец

    Регистр.:
    30 ноя 2009
    Сообщения:
    111
    Симпатии:
    46
    Если на сервере недоступен curl, можете просто откинуть заголовки ответа веб сервера следующим способом
    PHP:
    <?php
    $proxy 
    "10.10.10.10";  
    $port 8080;  
    $url "http://lenta.ru/r/illustrated.html"
    $fp = @fsockopen($proxy$port$errno$errstr10);  
    @
    fwrite($fp"GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n"); 
    $response '';
    while(!@
    feof($fp)){  
      
    $response .= @fgets($fp10024);  
    }  
    fclose($fp);

    // Например так разбить заголовки и body
    $exp explode"\r\n\r\n"$response);
    if ( isset( 
    $exp[1] ) )
    {
      
    $response $exp[1];
    }

    print( 
    $response );
     
    dino нравится это.
  4. betatest

    betatest

    Регистр.:
    3 дек 2007
    Сообщения:
    517
    Симпатии:
    127
    что-то слишком мудрено последний код
    если просто заголовки не нужны то так проще и нагрузка меньше
    заодно и пробельные в конце отсечем

    PHP:
      <?php
    $proxy 
    "10.10.10.10";  
    $port 8080;  
    $url "http://lenta.ru/r/illustrated.html"
    $fp = @fsockopen($proxy$port$errno$errstr10);  
    @
    fwrite($fp"GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n"); 
    $response '';
    while(!@
    feof($fp)){  
      
    $response .= @fgets($fp10024);  
    }  
    fclose($fp);

    $response=trim(strstr($response,"\r\n\r\n"));

    print( 
    $response ); 
     
    dino нравится это.
  5. krenkus

    krenkus Создатель

    Регистр.:
    10 мар 2008
    Сообщения:
    37
    Симпатии:
    4
    конструкция с fsockopen работает значительно медленнее, чем curl
    а заголовок html докумнета - он да, отделяется строкой '/n/r/n/r'
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Сокеты по определению не могут быть "значительно медленнее" курла.
    Менее удобны, чем курл - да, но не медленнее.
     
  7. krenkus

    krenkus Создатель

    Регистр.:
    10 мар 2008
    Сообщения:
    37
    Симпатии:
    4
    Да вот, я тоже удивился, когда наткнулся на это на практике.
    Объяснение простое - сокеты, это библиотека внутрях PHP, а curl - сторонняя библиотека.
    Кроме того в некоторых случаях, при работе, с особенно хитрожопыми серверами fsockopen/fgets(fread) может наглухо виснуть, не помогает даже таймаут выставленный в fscokopen :( При этом curl с такими справляется на ура, получая данные...
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    сокеты в PHP - это обёртка вокруг системных сокетов, точно так же как и курл в PHP - это обёртка над системной libcurl.
    Более того, сама libcurl - это, по сути, всего-лишь удобный интерфейс над сокетами :p
     
  9. krenkus

    krenkus Создатель

    Регистр.:
    10 мар 2008
    Сообщения:
    37
    Симпатии:
    4
    Ну да, это ты все правильно говоришь. И, не исключаю, что если использовать Socket функции в php (socket_), которые и есть "обертка" о котрой ты говоришь, то все будет супер, ибо они позволяют полностью программировать сокет, как тебе удобно, со всеми опциями типа AF_INET, SOCK_STREAM, SOL_TCP и т.д.
    Я лишь говорил про fsockopen - вот она работает достаточно грубо и решения на ее основе медленнее curla именно по той причине, что на весчь в себе, не позволяющая тонко настраивать socket.
     
Статус темы:
Закрыта.