2013-05-16 65 views
0

我有一個瀏覽器客戶端從我的Web服務中獲取部分內容,例如使用Range: bytes=100000-200000。請求進入PHP頁面fetch.php。在該PHP頁面中,我使用$_SERVER['HTTP_RANGE']獲取請求範圍,然後使用curl_setopt - CURLOPT_RANGE將其設置爲捲曲請求。我遇到的問題是,遠程服務器以206 Partial Content狀態和Content-Range標題進行響應,但我的PHP頁面僅響應200 OKContent-Range,因此結果是客戶認爲已完成的部分文件。問題是,我如何在PHP中設置Content-Range到原始請求?如何使用PHP/cURL代理請求並代理響應頭呢?

如果我知道前面的範圍,我不知道,我可以使用header命令並完成它,但範圍返回響應中。我可以設置curl接收所有標題的內容,然後解析出標題,使用header設置它,並將響應設置爲206,然後回顯所有數據......但數據是二進制的,更不用說非常大,所以這看起來不是最佳的。

我想知道如果我能以某種方式在PHP中設置一個選項,不發送任何它自己的頭,基本上只是將整個響應回顯給請求者。如果沒有充分考慮這一點,它可能會與其他標題,但緩存,連接,代理等問題。

也許有一種方法,我可以從curl只接收標題(某種partial_execute?),得到我需要設置頭文件和響應代碼,然後基本完成exec和實際響應get的輸出直接?我無法從捲曲中看到如何實現這一目標。

由於PHP腳本實際上確定資源的目標服務器(它不是靜態的),所以設置實際的反向代理也不是真正的選項。

我想我可以跳過使用curl並直接執行TCP/TLS連接並管理HTTP請求/響應。

任何其他想法或可能性?謝謝!

回答

0

也許有一種方法,我可以從捲曲

這是HTTP協議的一部分得到公正的頭,請參閱:What is the easiest way to use the HEAD command of HTTP in PHP?

我不明白是什麼問題,否則。

如果您收到部分回覆,可能是由於連接超時。這可以通過更改:

CURLOPT_CONNECTTIMEOUT

+0

我有一個客戶機和2臺服務器,代理服務器和實際的服務器:C-> P-> S上。客戶端通過Range標題請求部分內容。代理使用curl將請求傳遞給服務器。服務器正確迴應206部分內容。但是,PHP代理響應的返回值爲200 OK,因此它看起來像代理服務器一樣忽略了請求的部分內容,並且實際上只是部分響應。不知何故,我需要curl和PHP返回,它已經滿足了正確的部分響應。 – mark

+0

對此,仍然不是100%肯定的,但在我看來,您正在通過一臺服務器請求206頭,然後從另一臺服務器發送它。您是否不需要執行如下的操作:<?php header(「HTTP/1.0 206 Partial Content」); ?> –

+0

你是對的,我可以像你說的強制響應代碼,但據我所知,我不能從主服務器的響應中獲取Content-Range來放置該標頭。我可以讓curl返回頭文件,但它也會返回所有的內容(我寧願沒有一個大的字符串)......我沒有看到沒有獲取頭文件的方法。最後,我最終成功地使用了stream_socket_client而不是curl;我會在這個問題上回答這個問題,以防其他人絆倒這個。 – mark

1

這可能是也可能不是最佳的解決方案,但它在我需要的情況下工作。基本上只是做我自己的HTTP(S)獲取使用stream_socket_client確保攜帶必要的響應代碼和頭傳遞,如:

while (true) { 
    $h = stream_get_line($fp, 2048, "\r\n"); 
    if (!$h) { 
     break; 
    } 
    if (0==strncasecmp($h, 'Content-', 8)) { 
     header($h); 
    } 
    else if (0==strncasecmp($h, 'HTTP/1.', 7)) { 
     header($h); 
    } 
} 

fpassthru($fp);