0
<?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
?>
4

1 に答える 1

0

「1」を扱う最初のケース ブランチには break ステートメントがありません。リダイレクト ヘッダーを送信します、それはクライアントに送信される単なるヘッダーです。実行は終了しません。

コメントでの議論からのフィードバックを使用して、物事をもう少し明確にしようとします。

<?php

// writes a given string $buffer into a file handle spcified by the global $file
function ob_file_callback($buffer) 
{ 
    global $ob_file;
    fwrite($ob_file,$buffer); 
    return $buffer;
}

// main(): 

// #####
$forks = 1; // testing only !!
//$forks = 2; // testing only !!
// #####

global $ob_file = FALSE;
switch ($forks) {
    case 1:
        $ob_file = fopen('case1.txt','w');    
        ob_start('ob_file_callback');
        echo sprintf('ip = %s',$_SERVER['REMOTE_ADDR']);
        ob_end_flush();
        fclose($ob_file);
        header("Location: case1.php");
        break;
    case 2:
        $ob_file = fopen('case2.txt','w');
        ob_start('ob_file_callback');
        echo sprintf('ip = %s',$_SERVER['REMOTE_ADDR']);
        ob_end_flush();
        fclose($ob_file);
        header("Location: case2.php");
} // switch

?>

私はそのコードをテストしていません (そのため、構文に問題がある可能性があります...)。これを機能させる方法の提案を書き留めたいだけです...

于 2012-10-04T12:26:31.210 に答える