2012-01-05 3 views
1

Я хочу создать прокси-приложение, из которого я отправляю заголовок на сервер, и ответ идет прямо к клиенту и не использует всю пропускную способность сервера.PHP пройти через прокси

Единственный способ, которым я могу думать, это использовать PHP cURL для этого, но это не работает, так как он загружает файл и отправляет его клиенту. Я хочу знать, есть ли способ удалить или свести к минимуму использованную полосу пропускания.

Что я хочу делать: Клиенты открывают страницу, нажимают кнопку загрузки, затем MY-сервер запрашивает файл-файл для файла (используя заголовок) и отправляет его непосредственно клиенту или перенаправляет сервер MY на клиент ,

+0

Как вы собираетесь учитывать пропускную способность, используемую для отправки на сервер, а затем сервер, отправляющий ее клиенту? Первый закон термодинамики (отвлечен, конечно) –

+0

Я немного смущен вашим вопросом. Что вы подразумеваете под «учетной записью»? (Это не похоже на то, что я не знаю этого слова, но я просто не понимаю его в этом контексте) – Memoria

+0

Почему бы просто не использовать обратный прокси? – Layke

ответ

0

Нет, нет способа отправить веб-серверу ответ клиенту без запроса клиента непосредственно на этот сервер.

+0

Я думаю, вы что-то неправильно поняли. – Memoria

+0

То, о чем вы просите в вопросе (с прокси-сервером, не использующим пропускную способность прокси-сервера), обязательно потребует, чтобы серверный сервер отправлял ответ клиенту, не получив от него запрос (напрямую). Это невозможно. – duskwuff

+0

Это был вариант, я хочу свести к минимуму используемую пропускную способность для сервера. – Memoria

1
  • Клиенты открывает страницу нажмет кнопку загрузки
  • Мой сервер запросов к файловому серверу файл и отправляет клиенту 8k на время (в следующем примере).

Это использование CURLOPT_BUFFERSIZE, CURLOPT_HEADERFUNCTION и CURLOPT_WRITEFUNCTION.

<?php 
/* 
* curl-pass-through-proxy.php 
* 
* propose: php curl pass through proxy handle: big file, https, autentication 
* example: curl-pass-through-proxy.php?url=precise/ubuntu-12.04.4-desktop-i386.iso 
* limitation: don't work on binary if is enabled in php.ini the ;output_handler = ob_gzhandler 
* licence: BSD 
* 
* Copyright 2014 Gabriel Rota <[email protected]> 
* 
*/ 

    $url = "http://releases.ubuntu.com/" . $_GET["url"]; // NOTE: this example don't use https 
    $credentials = "user:pwd"; 
    $headers = array(
    "GET ".$url." HTTP/1.1", 
    "Content-type: text/xml", 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
    "Cache-Control: no-cache", 
    "Pragma: no-cache", 
    "Authorization: Basic " . base64_encode($credentials) 
); 

    global $filename; // used in fn_CURLOPT_HEADERFUNCTION setting download filename 
    $filename = substr($url, strrpos($url, "/")+1); // find last/

    function fn_CURLOPT_WRITEFUNCTION($ch, $str){ 
    $len = strlen($str); 
    echo($str); 
    return $len; 
    } 

    function fn_CURLOPT_HEADERFUNCTION($ch, $str){ 
    global $filename; 
    $len = strlen($str); 
    header($str); 
    //~ error_log("curl-pass-through-proxy:fn_CURLOPT_HEADERFUNCTION:str:".$str.PHP_EOL, 3, "/tmp/curl-pass-through-proxy.log"); 
    if (strpos($str, "application/x-iso9660-image") !== false) { 
     header("Content-Disposition: attachment; filename=\"$filename\""); // set download filename 
    } 
    return $len; 
    } 

    $ch = curl_init(); // init curl resource 
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // a true curl_exec return content 
    curl_setopt($ch, CURLOPT_TIMEOUT, 600); // 60 second 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // login $url 
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // don't check certificate 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // don't check certificate 
    curl_setopt($ch, CURLOPT_HEADER, false); // true Return the HTTP headers in string, no good with CURLOPT_HEADERFUNCTION 
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 8192 8k 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, "fn_CURLOPT_HEADERFUNCTION"); // handle received headers 
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'fn_CURLOPT_WRITEFUNCTION'); // callad every CURLOPT_BUFFERSIZE 

    if (! curl_exec($ch)) { 
     error_log("curl-pass-through-proxy:Error:".curl_error($ch).PHP_EOL, 3, "/tmp/curl-pass-through-proxy.log"); 
    } 

    curl_close($ch); // close curl resource 

?>