我希望能夠去mydoma.in/tunnel.php?file=http://otherdoma.in/music.mp3
,然後獲取流式傳輸到客戶端的數據http://otherdoma.in/music.mp3
。通過PHP調整鏈接數據?
我試圖通過Header();
這樣做,但它重定向而不是「調整」數據。
我怎樣才能做到這一點?
我希望能夠去mydoma.in/tunnel.php?file=http://otherdoma.in/music.mp3
,然後獲取流式傳輸到客戶端的數據http://otherdoma.in/music.mp3
。通過PHP調整鏈接數據?
我試圖通過Header();
這樣做,但它重定向而不是「調整」數據。
我怎樣才能做到這一點?
有你的PHP腳本拉遠程內容:
$data = file_get_contents($remote_url);
然後就是吐了出來:
echo $data;
或者乾脆:
echo file_get_contents($remote_url);
您可能需要添加一些標題來指示內容類型。
或者,你可以配置一個類似nginx
的代理 - 這將允許你重寫特定的URL到遠程站點,然後將它們作爲本地服務器,無需編碼。
如果它們很小,則可以使用file_get_contents()。否則,你應該使用cURL。你會想要從變量「file」中獲取URL。然後使用PHP將它保存到本地臨時位置。然後,使用header()將自己定向到本地文件。刪除臨時文件是唯一的問題,因爲沒有辦法確定您是否完成下載。因此,您可能可以睡眠或延遲文件刪除,但是您可能會發現使用cron作業稍後清理所有臨時文件是更好的選擇。
使用cURL流媒體:
<?php
$url = $_GET["file"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
curl_exec($ch);
curl_close($ch);
?>
請問不要先下載整個文件?我想盡可能少地保留在硬盤上。 –
我認爲每個256字節,它刷新到標準輸出(在這種情況下是網頁瀏覽器)。它不應該使用超過CURLOPT_BUFFERSIZE字節的內存。 – KikoV
啊,我會試試看。這聽起來像一個很好的解決方案:) –
使用的file_get_contents將需要下載整個文件,第一個吧?我正在尋找可以「流」它的東西。 nginx的東西看起來很有趣 - 我使用nginx,並且我很熟悉它,但我只知道基本的配置文件。我假設我將不得不使用重寫和這些代理規則,我將如何去做? –
是file_get_contents將首先下載整個文件。提供的nginx鏈接給出了例子。如果你沒有注意到它是一個鏈接,我只是強調它。 –
我明白你的意思,我只是不知道如何配置nginx來代理在url中指定的url(I.E.'domain.com/tunnel/ {URL}'會代理'{URL}')。 –