, 나는 "이미 보낸 헤더는"코드의 마지막 줄에 경고 예상 헤더가 전송되지만 그의 예제는 정상적으로 작동합니다.
일부 조사는 다음과 같은 결론에 날 리드 :
당신이, 당신은 HTTP 헤더와 내용에게 방법을 보낼 수 있습니다 (사용자가 하나 또는 기본 PHP 하나 weither) 출력 버퍼를 사용시
너 싶어. 모든 프로토콜은 본문 (따라서 용어 "헤더") 앞에 헤더를 보내야하지만, 출력 버퍼 레이어를 사용하면 PHP 이 처리해줍니다. 헤더 (header(), setcookie(), session_start())를 사용하여 재생되는 모든 PHP 함수는 버퍼를 채우는 내부 sapi_header_op() 함수 을 실제로 사용합니다. 그런 다음 printf()를 사용하여 출력을 작성하면 에 출력 버퍼를 씁니다 (하나라고 가정). 출력 버퍼가 이 될 때, PHP는 먼저 헤더를 보낸 다음 본문을 보낸다. PHP 이 모든 것을 처리해줍니다.이 동작이 마음에 들지 않으면 은 출력 버퍼 계층을 비활성화하는 것 외에 다른 선택의 여지가 없습니다. 대부분의 구성 하에서
및
PHP는 버퍼의 기본 사이즈 킬로바이트까지의 데이터를 저장할 수있는 버퍼 PHP 수단 4096 바이트 (4킬로바이트)이다. 이 한도를 초과하거나 PHP 코드 실행이 완료되면 버퍼 된 내용 은 PHP가 사용되는 백엔드 (CGI, , mod_php, FastCGI)에 자동으로으로 전송됩니다. 출력 버퍼링은 PHP-CLI에서 항상 Off입니다. 이 버퍼 크기를 초과하지 않는 (마지막 헤더가 전송되기 전에 스크립트가 분명히 종료되지 않음) 때문에 출력 버퍼를 자동으로 플러시하지 않았기 때문에
에드 슨의 코드가 작동합니다.
출력 버퍼의 데이터가 버퍼 크기를 초과하면 경고가 발생합니다. 또는 그의 예에서,
$get_users_stmt->fetch(PDO::FETCH_ASSOC)
의 데이터가 너무 클 때.
이 문제를 방지하려면 ob_start() 및 ob_end_flush();로 출력 버퍼링을 관리해야합니다. 아래처럼 :
// Turn on output buffering
ob_start();
// Define handle to output stream
$basic_info = fopen("php://output", 'w');
// Define and write header row to csv output
$basic_header = array('Header1', 'Header2');
fputcsv($basic_info, $basic_header);
$count = 0; // Auxiliary variable to write csv header in a different way
// Get data for remaining rows and write this rows to csv output
while($user_row = $get_users_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($count == 0) {
// Write select column's names as CSV header
fputcsv($basic_info, array_keys($user_row));
} else {
//Write data row
fputcsv($basic_info, $user_row);
}
$count++;
}
// Get size of output after last output data sent
$streamSize = ob_get_length();
//Close the filepointer
fclose($basic_info);
// Send the raw HTTP headers
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=test.csv');
header('Expires: 0');
header('Cache-Control: no-cache');
header('Content-Length: '. ob_get_length());
// Flush (send) the output buffer and turn off output buffering
ob_end_flush();
당신은 여전히 다른 제한에 묶여 있습니다.
출력 버퍼에 쓰는 경우 즉시 클라이언트로 보냅니다. 어떤 경우 든 먼저 모든 헤더를 보내야합니다. – datasage
ob_start()를 어딘가에하지 않으면 ob_clean()이 무의미합니다. readfile WRITES를 출력으로 간주하지만, 그 입력으로부터 읽는 중입니다.이 코드보다 먼저 ob_start()를 수행하지 않았다면, fputcsv()는 헤더 코드가 실행되기 전에 브라우저에 출력을 남겼습니다. –
"@"를 사용할 때마다 PHP에서 문자 그대로 하나의 메서드 이름을 지정할 수 있습니다. 그것은 당신의 코드가 아니므로 각 줄에 @를 심는 대신 처음 시작할 때 코드를 올바르게 작성할 수 있습니까? –