超出EOF的PHP fwrite模式“r +”不起作用,XAMPP,Windows 10 x64 [重复]

Posted

技术标签:

【中文标题】超出EOF的PHP fwrite模式“r +”不起作用,XAMPP,Windows 10 x64 [重复]【英文标题】:PHP fwrite mode "r+" beyond EOF not working, XAMPP, Windows 10 x64 [duplicate] 【发布时间】:2019-07-16 05:14:39 【问题描述】:

我正在尝试使用 fread/fwrite 从文件中读取和写入数据,文件打开模式为“r+”。当我使用 fwrite 写入一个比文件打开时的原始长度更长的字符串时,它会被截断。在 Windows 10 x64、php 7.3.7.0 上运行最新版本的 XAMPP。

我已经检查了 fwrite 周围所有方法调用的返回值,并且输出对我来说似乎很神秘,除非有明显的我遗漏的东西。我还尝试在 fwrite 操作之前将文件截断为新的扩展大小。

PrvOpen 使用文件模式“r+”打开文件,并使用flock() 获得对它的排他锁。 PrvClose 释放锁然后关闭文件。

public function SetStatus($name, $status)

    $fp = $this->PrvOpen();

    $fdata = fread($fp, filesize($this->path));
    echo("SetStatus: fdata in: $fdata<br/>");

    $allTasks = unserialize($fdata);
    $allTasks[$name] = $status;

    $this->PrvClear($fp);
    $fdata = serialize($allTasks);
    echo("SetStatus: fdata out: $fdata<br/>");

    $dataLength = mb_strlen($fdata);
    echo("SetStatus: data length: $dataLength<br/>");

    $truncResult = ftruncate($fp, mb_strlen($fdata));
    echo("SetStatus: truncate result: $truncResult<br/>");

    $seekResult = fseek($fp, 0, SEEK_SET);
    echo("SetStatus: seek result: $seekResult<br/>");

    $cnt = fwrite($fp, $fdata);
    echo("SetStatus: count written: $cnt/" . mb_strlen($fdata) . "<br/>");

    $flushResult = fflush($fp);
    echo("SetStatus: flush result: $flushResult<br/>");

    $fpos = ftell($fp);
    echo("SetStatus: file position: $fpos<br/>");

    echo("SetStatus: filesize before close: " . filesize($this->path) . "<br/>");

    $this->PrvClose($fp);
    echo("SetStatus: filesize after close: " . filesize($this->path) . "<br/>");

浏览器输出如下所示。可以看到围绕 fwrite 的所有操作的返回值。它成功地将 35 个字节写入文件。文件位置标记为 35 个字节。刷机成功。所有操作都成功了,但是文件写入后的大小只有6个字节,是打开时的原始大小。

在同时显示调试输出的后续操作中,打开文件并显示其内容,这些内容被截断为前 6 个字符。

SetStatus: fdata in: a:0:
SetStatus: fdata out: a:1:s:8:"testtask";s:7:"running";
SetStatus: data length: 35
SetStatus: truncate result: 1
SetStatus: seek result: 0
SetStatus: count written: 35/35
SetStatus: flush result: 1
SetStatus: file position: 35
SetStatus: filesize before close: 6
SetStatus: filesize after close: 6

Delete: file size: 6
Delete: fdata in: a:1:s

背景是我正在尝试编写一个类或一组类来协调异步后台进程的运行以及状态信息的通信。我创建了一个接口来执行此操作,并创建了它的文件实现,它将任务状态信息序列化/反序列化到/从文件中。

【问题讨论】:

看看***.com/questions/3747982/…,如果有帮助,可以将其作为副本关闭。 @NigelRen 谢谢。这确实解决了问题。 【参考方案1】:

重复的问题。正如 Nigel Ren 所指出的,这是由于未能清除 PHP 的统计缓存。

【讨论】:

以上是关于超出EOF的PHP fwrite模式“r +”不起作用,XAMPP,Windows 10 x64 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 严格模式

php fwrite换行

PHP 'fwrite' 不会使用变量

PHP中,fwrite写入文件的时候,怎么换行?

fwrite 消耗所有 MemFree,fflush 不起作用?

C 语言文件操作 ( fwrite 函数 )