2010-01-21 81 views
0

我正在與以下部分的PHP代碼。目的是將圖像文件從一臺服務器發佈到另一臺服務器。只要文件爲<〜250k,此功能就可以完美並且非常快速地工作。超過250k,處理時間跳到約60秒,並從那裏增加圖像大小。奇怪的延遲發佈從PHP fsockopen

任何想法?

謝謝!

約翰

$fileContents = file_get_contents($_FILES[$key]['tmp_name']); 
$time = strtotime("now"); 
$body = "--f6sd54c2 
Content-Disposition: form-data; name=\"id\" 
Content-Length: " . strlen($id) . " 

{$id} 
--f6sd54c2 
Content-Disposition: form-data; name=\"key\" 
Content-Length: " . strlen("654t2bsr65t42czd13fvs6dry87") . " 

654t2bsr65t42czd13fvs6dry87 
--f6sd54c2 
Content-Disposition: form-data; name=\"time\" 
Content-Length: " . strlen($time) . " 

{$time} 
--f6sd54c2 
Content-Disposition: form-data; name=\"photo\"; filename=\"photo.jpg\" 
Content-Type: image/jpeg 
Content-Length: " . strlen($fileContents) . " 

{$fileContents} 
--f6sd54c2--"; 


$headers = "POST /photos/process.php HTTP/1.1 
Host: www.hostname.com 
Keep-Alive: 300 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=f6sd54c2 
Content-Length: " . strlen($body) . " 

"; 

$fp = fsockopen("www.hostname.com", 80, $errno, $errstr); 
if ($fp){ 
    fwrite($fp, $headers . $body); 
    fclose($fp); 
} 
+0

服務器之間的連接是什麼?他們是在同一個本地網絡,一個灣,還是通過網絡? – Cryophallion 2010-01-21 17:38:21

回答

4

您正在使用HTTP/1.1,即使你關閉連接的時候了。 HTTP/1.1維護可能引入延遲的連接。你應該已經使用CURL,編寫自己的客戶端是總是一個壞主意,特別是對於HTTP。工程師不應該重新創造風團。如果將標題更改爲HTTP/1.0不起作用,curl將解決該問題。

+1

這對解決類似問題非常有幫助。謝謝。 – 2012-04-12 18:58:58

0

您也有Connection:keep-alive ..這將保持連接打開。嘗試連接:請求作出

0

收盤後結束連接,因爲我最初發布無需註冊,我不知道我可以回覆/正確地編輯自己的帖子,但我會在這裏迴應...

  • 服務器連接只是通過網絡。

  • 這肯定會讓我的生活更容易使用CURL,但遺憾的是它在這臺服務器上不可用。

  • 嘗試切換到HTTP/1.0,嘗試連接:關閉,但問題保持不變。幾乎在一定水平(幾百kb)以下的瞬間轉移,在任何高於該水平的地方,至少需要一分鐘。

謝謝。

1

如果其它服務器並不需要處理的數據從一個多HTML表單來的一個文件瀏覽/輸入字段,那麼你可以設置一個文件傳輸了一個正常的POST請求是這樣的:

$postQuery = 'fileName=image.jpg&fileData='.base64_encode(file_get_contents('image.jpg')); 

然後在服務器$_POST['fileName']$_POST['fileData']可用。