i have a downloading website written in php to download from remote servers using curl but the thing is the httpd connections are not terminated they are still in sleeping mod which is killing my server resources, here is the top output
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
i traced one pid using this strace -p 22254 -s 80 -o /tmp/debug.lighttpd.txt i got this output which i’m not sure but it seems to be polling and polling
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)
are there any http headers that i’m missing or is there anyway to terminate those connections, any ideas??
here is the php code that i’m using, this is the important part of it
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();
}
So the problem was with http headers keep-alive, the connection was kept alive causing the trouble, here is how i fixed it.
i didn’t initiate and close curl every time, instead one curl is initialed and i send http headers defining keep-alive and keep-alive time. this solved my problem