2012-07-30 90 views
2

我有一個用php編寫的下載網站,使用curl從遠程服務器上下載,但事情是httpd連接沒有終止,它們仍然處於睡眠模式,這是我的服務器資源被查殺,這裏是頂級輸出許多睡眠httpd連接

 
top - 20:55:36 up 4 days, 13:41, 1 user, load average: 1.99, 5.73, 
10.47 Tasks: 2207 total, 5 running, 2202 sleeping, 0 stopped, 0 zombie Cpu(s): 24.1%us, 1.5%sy, 0.0%ni, 73.3%id, 0.0%wa, 0.0%hi, 1.1%si, 
0.0%st Mem: 4045976k total, 4000712k used, 45264k free, 1448k buffers Swap: 8385920k total, 2353584k used, 6032336k free, 30336k cached 

我跟蹤使用此strace -p 22254 -s 80 -o /tmp/debug.lighttpd.txt一個PID我得到這個輸出,我不知道,但它似乎是投票和投票

clock_gettime(CLOCK_MONOTONIC, {10396, 471413333}) = 0 
poll([{fd=24, events=POLLOUT}], 1, 725) = 0 (Timeout) 
clock_gettime(CLOCK_MONOTONIC, {10397, 196905333}) = 0 
clock_gettime(CLOCK_MONOTONIC, {10397, 196955333}) = 0 
poll([{fd=24, events=POLLOUT}], 1, 1000) = 0 (Timeout) 
clock_gettime(CLOCK_MONOTONIC, {10398, 197890333}) = 0 
clock_gettime(CLOCK_MONOTONIC, {10398, 197937333}) = 0 
poll([{fd=24, events=POLLOUT}], 1, 1000) = 0 (Timeout) 

在那裏我失蹤或任何HTTP頭無論如何要終止這些連接,任何想法?

這裏是我使用的PHP代碼,這是其中的重要組成部分它

header('Content-Disposition: filename='.$fileName); 
header("Content-Type: application/octet-stream\n"); 
header("Connection: close\n"); 
header("Accept-Ranges: bytes"); 
header("Content-Range: bytes 0-$size2/$size"); 
header("Content-Length: ".$size); 

while($start_range <= $end_range) { 
if (connection_status()!=0) return(false); 
if(($start_range + 999999) > $end_range) $range = $start_range.'-'; 
else $range = $start_range.'-'.($start_range + 999999); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $fileLocation); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
if ($cookie != false) curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
if ($refurl != false) curl_setopt($ch, CURLOPT_REFERER, $refurl); 
curl_setopt($ch, CURLOPT_RANGE,$range); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1'); 
curl_exec($ch); 
curl_close($ch); 
$start_range +=1000000; 

flush(); 
ob_flush(); 
ob_end_flush(); 
} 
+0

我們如何診斷這個問題沒有任何PHP代碼?堆棧跟蹤幾乎沒有用,甚至沒有。 – Steven 2012-07-30 00:53:11

+0

@JaredFarrish:我很抱歉,我將從現在開始回答 – EGN 2012-07-30 00:59:13

+0

@Steven:添加了PHP代碼 – EGN 2012-07-30 00:59:27

回答

0

所以問題是與HTTP頭保持活躍,連接保持活躍造成的麻煩,在這裏是我如何修復它。

我沒有發起和關閉每次捲曲,而是一個捲曲發起,我發送http頭定義保持活動和保持活動時間。這解決了我的問題

$ch = curl_init(); 
while($start_range <= $end_range) { 
    if (connection_status()!=0) return(false); 
    if(($start_range + 999999) > $end_range) $range = $start_range.'-'; 
    else $range = $start_range.'-'.($start_range + 999999); 
    curl_setopt($ch, CURLOPT_URL, $fileLocation); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Connection: Keep-Alive', 
    'Keep-Alive: 300', 
    'Cache-Control: no-cache' 
    )); 
    if ($cookie != false) curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
    if ($refurl != false) curl_setopt($ch, CURLOPT_REFERER, $refurl); 
    curl_setopt($ch, CURLOPT_RANGE,$range); 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1'); 
    $content = curl_exec($ch); 
    echo $content; 
    unset($content); 
    $start_range +=1000000;  
    flush(); 
    ob_flush(); 
} 
curl_close($ch); 
+0

爲什麼你需要保持活力?爲什麼不設置CURLOPT_CONNECTTIMEOUT? – Steven 2012-07-31 19:33:19