【问题标题】:Problems with ob_file_callback and fwriteob_file_callback 和 fwrite 的问题
【发布时间】:2012-10-04 12:18:56
【问题描述】:
<?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,而且甚至不会显示默认页面。它声称标题位置存在问题,因为标题已经发送,这是超现实的。然后,即使我没有要求它重新声明 ob_file_callback 因为它在案例 2 中并且我选择了案例 1,但它声称无法在案例 2 中的 ob_file_callback 上重新声明 ob_file_callback。

如果我选择 $forks = 2,它不会写入任何文件,只是声称它不能修改头信息,所以这是另一个头重定位失败,这也是愚蠢的。但是它确实给了我默认页面,但这只会让我更加困惑。

我对 fwrite、ob_start 或 ob_end_flush 或任何正在写入文件的东西的问题是它只会写入一次。要么就是每次打开它都会擦除文件,所以结果是当 forks 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
?>

【问题讨论】:

    标签: php header case fwrite


    【解决方案1】:

    在处理“1”的第一个 case 分支中没有 break 语句。 您确实发送了一个重定向标头,但这只是发送给客户端的标头。它确实终止执行!

    使用来自 cmets 讨论的反馈,我试图让事情变得更清楚一点:

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

    我还没有测试过那个代码(所以可能有一些语法故障......)。我只想记下有关如何使其正常工作的建议...

    【讨论】:

    • 嗯,这可能阻止了它写入case2.txt,现在它似乎正在写入case1.txt,但还有许多其他更莫名其妙的问题正在发生。另外,当您说我正在发送标头但未终止时,我不知道您的意思。
    • 不终止意味着:脚本继续执行。它不会因为您调用 header() 函数而简单地停止。为什么要这样做?
    • 为什么要声明这个函数 ob_file_callback() 两次?我很惊讶这是可能的。您当然想改变它并将函数实现放在 switch 语句之外。把它放在脚本的开头。
    • 好的,我已经将函数提取到 case 之外,但它仍然不会写入 case1.txt,并且两个标头重定位都失败了。退出还不够好吗?以上是第一轮修正中的变化。
    • 退出终止,是的。但这里不需要,开关很好(期待“}”的奇怪缩进)。那个全局变量也很丑陋,但无论如何......
    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多