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

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

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, $errstr, 10); 
@fwrite($fp, "GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n");
while(!@feof($fp)){ 
  $line = @fgets($fp, 10024); 
  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
что очень неудобно
Огромная просьба описать какие ещё есть способы выхода в инет через проксю... Заранее всем спасибо!
 
PHP:
//Использование функции
get("http://lenta.ru/r/illustrated.html", "10.10.10.10:8080");

function get($url,$proxy)
	{
       $ch = curl_init($url);
       curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.80 (Windows NT 5.1; U; MRA 5.4 (build 02652); ru) Presto/2.2.15 Version/10.00");
       curl_setopt($ch, CURLOPT_COOKIEJAR, "./cook");
	   curl_setopt($ch, CURLOPT_COOKIEFILE, "./cook");
	   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
	   curl_setopt($ch, CURLOPT_TIMEOUT, 10);  
	   curl_setopt($ch, CURLOPT_PROXY, $proxy);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       $result  = curl_exec($ch);
       curl_close( $ch );
	   return $result;
	}
 
  • Нравится
Реакции: dino
Если на сервере недоступен curl, можете просто откинуть заголовки ответа веб сервера следующим способом
PHP:
<?php
$proxy = "10.10.10.10";  
$port = 8080;  
$url = "http://lenta.ru/r/illustrated.html"; 
$fp = @fsockopen($proxy, $port, $errno, $errstr, 10);  
@fwrite($fp, "GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n"); 
$response = '';
while(!@feof($fp)){  
  $response .= @fgets($fp, 10024);  
}  
fclose($fp);

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

print( $response );
 
  • Нравится
Реакции: dino
что-то слишком мудрено последний код
если просто заголовки не нужны то так проще и нагрузка меньше
заодно и пробельные в конце отсечем

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

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

print( $response );
 
  • Нравится
Реакции: dino
конструкция с fsockopen работает значительно медленнее, чем curl
а заголовок html докумнета - он да, отделяется строкой '/n/r/n/r'
 
Сокеты по определению не могут быть "значительно медленнее" курла.
Менее удобны, чем курл - да, но не медленнее.
 
Сокеты по определению не могут быть "значительно медленнее" курла.
Менее удобны, чем курл - да, но не медленнее.
Да вот, я тоже удивился, когда наткнулся на это на практике.
Объяснение простое - сокеты, это библиотека внутрях PHP, а curl - сторонняя библиотека.
Кроме того в некоторых случаях, при работе, с особенно хитрожопыми серверами fsockopen/fgets(fread) может наглухо виснуть, не помогает даже таймаут выставленный в fscokopen :( При этом curl с такими справляется на ура, получая данные...
 
сокеты в PHP - это обёртка вокруг системных сокетов, точно так же как и курл в PHP - это обёртка над системной libcurl.
Более того, сама libcurl - это, по сути, всего-лишь удобный интерфейс над сокетами :p
 
сокеты в PHP - это обёртка вокруг системных сокетов, точно так же как и курл в PHP - это обёртка над системной libcurl.
Более того, сама libcurl - это, по сути, всего-лишь удобный интерфейс над сокетами :p
Ну да, это ты все правильно говоришь. И, не исключаю, что если использовать Socket функции в php (socket_), которые и есть "обертка" о котрой ты говоришь, то все будет супер, ибо они позволяют полностью программировать сокет, как тебе удобно, со всеми опциями типа AF_INET, SOCK_STREAM, SOL_TCP и т.д.
Я лишь говорил про fsockopen - вот она работает достаточно грубо и решения на ее основе медленнее curla именно по той причине, что на весчь в себе, не позволяющая тонко настраивать socket.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху