2013-06-19 57 views
3

下面的代碼在Firefox上正確執行,但不在Chrome上執行。後者總是顯示「ERR_RESPONSE_HEADERS_TOO_BIG」。當我遍歷包含超過10000個項目(文件)的文件夾時發生此錯誤 - 它必須是長時間的任務。爲什麼我會在Chrome上獲得「ERR_RESPONSE_HEADERS_TOO_BIG」?

請誰能解釋我如何避免這個錯誤?如果我「回聲」 - 在ob_end_clean()之後,錯誤消失。

<?php 

ini_set('max_execution_time', 600); 

function FileItemsCount($it, &$count_ref) 
{ 
    foreach ($it as $file) 
    { 
     $count_ref += 1; 

ob_start(); 
     session_start(); 
     $_SESSION['progress'] = $count_ref; 
     session_write_close(); 
ob_end_clean() ; 

     $is_folder = $it->hasChildren(); 
     if ($is_folder) 
     { 
      FileItemsCount($it->getChildren(), $count_ref); 
     } 
    } 
} 

$dir = "C:/Users/sstefanov/xampp"; 

$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); 

$count = 0; 
FileItemsCount($it, $count); 


echo $count; 

?> 
+3

我'd懷疑這是因爲你每次都會在循環中打開和關閉會話(爲什麼你會這樣做?) - 那可能會導致session_start每次都會生成一個新的SetCookie頭文件,因此Chrome會生氣...... – CBroe

+0

CBroe是正確的,瀏覽器將接受的標頭數量有限制。這也意味着您可以創建的cookie數量受到限制。 – DCoder

+0

我是C++程序員,爲了在並行php進程間同步$ _SESSION ['progress']變量,我想到了session_start()/ session_write_close()作爲Enter/Leave critical_section。可能是我錯了,但無法找到在PHP中同步化的其他方式。 – netanalyzer

回答

10

一些necroposting對於那些,誰將會尋找一個答案:)

我試圖做類似的事情 - 疏通並行Ajax請求,其中一項要求長期運行等檢查進展情況。 我每次都會開始會話以寫入新值並在之後立即停止。我在Chrome中也遇到了ERR_RESPONSE_HEADERS_TOO_BIG錯誤。

原因是PHP發送Set-Cookie標題與每個會話開始在我的情況。當長ajax請求完成時,服務器將所有Set-Cookie標題發送到瀏覽器。

爲了解決這個問題,我在輸出之前通過調用 header_remove('Set-Cookie');刪除了Set-Cookie標題。

+1

謝謝!拯救我的一天:) –

0

這不是在這個問題的話,但我認爲這將是有益的分享,這個錯誤也可能出現如果正在印刷過多的數據/服務器迴應(例如用於調試)

相關問題