2

私は、curlを使用してリモートサーバーからダウンロードするためにphpで書かれたダウンロードWebサイトを持っていますが、httpd接続が終了しておらず、サーバーリソースを強制終了しているmodがまだスリープ状態になっています。これがトップ出力です。

トップ-20:55:36アップ4日間、13:41、1ユーザー、平均負荷:1.99、5.73、  
10.47タスク:合計2207、実行中5、スリープ中2202、停止0、ゾンビCPU 0: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、使用済み4000712k、空き45264k、バッファ1448kスワップ:合計8365920k、使用済み2353584k、空き6032336k、キャッシュ30336k

これを使用して1つのpidをトレースしstrace -p 22254 -s 80 -o /tmp/debug.lighttpd.txtました。この出力を取得しましたが、よくわかりませんが、ポーリングとポーリングのようです。

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();
}
4

1 に答える 1

0

したがって、問題はhttpヘッダーの維持にあり、接続が維持されて問題が発生しました。これが修正方法です。

毎回curlを開始して閉じるのではなく、1つのcurlが初期化され、キープアライブとキープアライブ時間を定義する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);
于 2012-07-30T17:49:07.077 に答える