2012-05-04 1 views
11

나는 ob_start() ob_end_clean() ob_end_flush()에 대한 PHP 매뉴얼을 검토했다. 그리고 주제에 대한 다른 예를 보았습니다. 어쨌든 나는 예제를 수정했지만이 시점에서는 혼란 스럽습니다. 여기 스크립트가 있습니다. 이 스크립트 ob_end_clean() 또는 ob_end_flush()없이 다중 ob_start()를 사용할 때 어떤 일이 발생 했습니까?

ob_start(); 
echo "Hello x, "; 

ob_start(); 
echo "Hello y, "; 

ob_start(); 
echo "Hello z, "; 

ob_start(); 
echo "Hello World"; 
$ob_2 = ob_get_contents(); 
ob_end_clean(); 

echo "Galaxy"; 
$ob_1 = ob_get_contents(); 
ob_end_clean(); 

echo " this is OB_1 : ".$ob_1; 
echo "<br> and this is OB_2 : ".$ob_2; 

출력은 안녕하세요 Z 갤럭시

이것은 OB_2이다 :

안녕하세요는 헬로 Y를 X

이것은 OB_1이다 안녕하세요

--------------------------------------------

왜 출력이 그렇게 좋지 않습니까?

이 OB_1입니다 : 안녕하세요 X, 안녕하세요 Y, 안녕하세요 Z,

갤럭시이이 OB_2입니다 : 안녕하세요

그리고이 지점 내가 무엇을 놓친입니까?

답변

17

출력 버퍼는 스택처럼 작동합니다. 하나의 버퍼를 만들고 "Hello x"를 echo 한 다음 다른 버퍼를 만들고 "Hello y"를 echo 한 다음 세 번째 버퍼를 만들고 "Hello z"를 echo합니다. "Hello World"는 ob_end_clean()에 대한 호출로 닫히는 네 번째 버퍼로 이동하므로 다시 세 번째 버퍼로 돌아갑니다. "Galaxy"를 울린 후 ob_get_contents()으로 전화하면 세 번째 버퍼의 내용을 가져옵니다.

이 코드의 끝에 ob_get_contents()을 다시 호출하면 두 번째 버퍼에 "Hello y"가 표시됩니다. ob_end_close() 그 다음에 ob_get_contents() 인 경우 첫 번째 버퍼에서 "Hello x"를 얻을 수 있습니다.

+2

: 모든 출력 버퍼가 비어있는 것으로 초기화, 즉 표준입니다. 당신은 * 일어나고있는 일들을 설명하는 최초의 사람입니다. +1하지만 간단하지만 유용합니다. –

32

나는 무슨 일이 일어나는지 설명하기 위해 코드에 주석을 답니다. 내가 도움이 소스를 찾기 위해 노력하고, 한 시간 등 플러시(), ob_flush()를 사용하는 것을 시도하고있다

ob_start(); // open output buffer 1 
echo "Hello x, "; // echo appended to output buffer 1 

ob_start(); // open output buffer 2 
echo "Hello y, "; // echo appended output buffer 2 

ob_start(); // open output buffer 3 
echo "Hello z, "; // echo appended to output buffer 3 

ob_start(); // open output buffer 4 
echo "Hello World"; // echo appended output buffer 4 
$ob_2 = ob_get_contents(); // get contents of output buffer 4 
ob_end_clean(); // close and throw away contents of output buffer 4 

echo "Galaxy"; // echo appended to output buffer 3 
$ob_1 = ob_get_contents(); // get contents of output buffer 3 
ob_end_clean(); // close and throw away contents of output buffer 3 

// at this point, $ob_2 = "Hello World" and $ob_1 = "Hello z, Galaxy" 
// output buffer 1 = "Hello x," and output buffer 2 = "Hello y," 

echo " this is OB_1 : ".$ob_1; // echo appended to output buffer 2 

// output buffer 2 now looks like "Hello y, this is OB_1 : Hello z, Galaxy" 

echo "<br> and this is OB_2 : ".$ob_2; // echo appended to output buffer 2 

// output buffer 2 now looks like: 
// "Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 

// output buffer 2 implicitly flushed by end of script 
// output from buffer 2 captured by (appended to) output buffer 1 
// output buffer 1 now looks like: 
// "Hello x, Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 
// output buffer 1 implicitly closed by end of script. This is when your output 
// actually gets printed for this particular script. 
+1

고마워, 너무 분명해. –

+1

죄송합니다, 정말로 잊어 버렸습니다 –

+1

이것은 위대한 설명 hehe입니다. :디 – gumuruh

관련 문제