0

我有一个问题,我似乎无法找到解决方案。我正在尝试写入平面文本文件。我已经在屏幕上回显了所有变量,验证了用户的权限(www-data),只是为了咧嘴笑,将整个文件夹中的所有内容都设置为 777 - 一切都无济于事。最糟糕的是我可以从另一个文件调用相同的函数并写入。我看不到在这里找到共同点......

function ReplaceAreaInFile($AreaStart, $AreaEnd, $File, $ReplaceWith){
$FileContents = GetFileAsString($File);
$Section = GetAreaFromFile($AreaStart, $AreaEnd, $FileContents, TRUE);
if(isset($Section)){
    $SectionTop = $AreaStart."\n";
    $SectionTop .= $ReplaceWith;
    $NewContents = str_replace($Section, $SectionTop, $FileContents);

    if (!$Handle = fopen($File, 'w')) {
        return "Cannot open file ($File)";
        exit;
    }/*
    if(!flock($Handle, LOCK_EX | LOCK_NB)) {
        echo 'Unable to obtain file lock';
        exit(-1);
    }*/
    if (fwrite($Handle, $NewContents) === FALSE) {
        return "Cannot write to file ($File)";
        exit;
    }else{
        return $NewContents;
    }
}else{
        return "<p align=\"center\">There was an issue saving your settings. Please try again. If the issue persists contact your provider.</p>";
}
}
4

2 回答 2

0

尝试...

$Handle = fopen($File, 'w');
if ($Handle === false) {
    die("Cannot open file ($File)");
}
$written = fwrite($Handle, $NewContents);
if ($written === false) {
    die("Invalid arguments - could not write to file ($File)");
}
if ((strlen($NewContents) > 0) && ($written < strlen($NewContents))) {
    die("There was a problem writing to $File - $written chars written");
}
fclose($Handle);
echo "Wrote $written bytes to $File\n"; // or log to a file
return $NewContents;

并检查错误日志中的任何问题。应该有一些东西,假设您启用了错误日志记录。

您需要检查写入的字符数,因为在 PHP 中 fwrite 的行为如下:

在遇到 fwrite() 在完全期望返回值为 false 的情况下返回 0 的问题后,我查看了 php 的 fwrite() 本身的源代码。如果您传入无效参数,该函数只会返回 false。任何其他错误,如管道损坏或连接关闭,将导致返回值小于 strlen($string),在大多数情况下为 0。

另外,请注意,您可能正在写入文件,但写入的是您期望写入的不同文件。绝对路径可能有助于跟踪这一点。

于 2012-12-03T06:57:17.037 回答
0

我最终为此使用的最终解决方案:

function ReplaceAreaInFile($AreaStart, $AreaEnd, $File, $ReplaceWith){
    $FileContents = GetFileAsString($File);
    $Section = GetAreaFromFile($AreaStart, $AreaEnd, $FileContents, TRUE);
    if(isset($Section)){
        $SectionTop = $AreaStart."\n";
        $SectionTop .= $ReplaceWith;
        $NewContents = str_replace($Section, $SectionTop, $FileContents);
        return $NewContents;
    }else{
        return "<p align=\"center\">There was an issue saving your settings.</p>";
    }
}

function WriteNewConfigToFile($File2WriteName, $ContentsForFile){
    file_put_contents($File2WriteName, $ContentsForFile, LOCK_EX);
}

我确实最终使用了绝对文件路径,并且不得不检查文件的权限。我必须确保 Apache 中的 www-data 用户能够写入文件并且也是运行脚本的用户。

于 2013-04-15T17:15:56.100 回答