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 :(得分:0)
所以问题是http header keep-alive,连接保持活着导致麻烦,这就是我修复它的方法。
我没有每次启动和关闭curl,而是一个curl初始化,我发送http头定义keep-alive和keep-alive时间。这解决了我的问题
$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);