<?php
$forks = 2;
switch ($forks) {
case 1:
$ob_file = fopen('case1.txt','w');
function ob_file_callback($buffer)
{
global $ob_file;
fwrite($ob_file,$buffer);
}
ob_start('ob_file_callback');
echo $ip = $_SERVER['REMOTE_ADDR'];
ob_end_flush();
header("LOCATION: case1.php");
case 2:
$ob_file = fopen('case2.txt','w');
function ob_file_callback($buffer)
{
global $ob_file;
fwrite($ob_file,$buffer);
}
ob_start('ob_file_callback');
echo $ip = $_SERVER['REMOTE_ADDR'];
ob_end_flush();
;
header("LOCATION: case2.php");
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
$forks = 1 を選択すると、case2.txt に書き込まれますが、これは問題です。LOCATION のリダイレクトに失敗するだけでなく、デフォルトのページも表示されません。ヘッダーが既に送信されているため、ヘッダーの場所に問題があると主張していますが、これは現実的ではありません。次に、ケース2であり、ケース1を選択したため、ob_file_callbackを再宣言するように求めていませんが、ケース2の中にあるob_file_callbackでob_file_callbackを再宣言できないと主張しています。
$forks = 2 を選択すると、どのファイルにも書き込まれず、ヘッダー情報を変更できないと主張するだけなので、別のヘッダー再配置の失敗です。これもばかげています。ただし、デフォルトのページが表示されますが、さらに混乱します。
fwrite、ob_start、ob_end_flush、またはファイルへの書き込みを行っているものに関する私の問題は、一度しか書き込まないことです。それか、ファイルを開くたびにファイルを消去しているため、結果として生じる問題は、フォーク 1 が実際に case2.txt に書き込む場合、そこに座っている文字列は常に 1 つだけです。
修正の最初のラウンド:
<?php
function ob_file_callback($buffer)
{
global $ob_file;
fwrite($ob_file,$buffer);
}
$forks = 1;
switch ($forks) {
case 1:
$ob_file = fopen('case1.txt','w');
ob_start('ob_file_callback');
echo $ip = $_SERVER['REMOTE_ADDR'];
ob_end_flush();
header("LOCATION: case1.php");
exit;
break;
case 2:
$ob_file = fopen('case2.txt','w');
ob_start('ob_file_callback');
echo $ip = $_SERVER['REMOTE_ADDR'];
ob_end_flush();
header("LOCATION: case2.php");
}
exit
?>