fwrite(): 写入 XX 字节失败,errno=5 输入/输出错误

问题描述

我之前有 2 个类似的问题,但是经过更多的调试后,我得出的结论是问题(可能)不在我自己的代码中。

在我的代码中,我试图解压缩一个 gzipped 文件,为此我编写了一个方法

<?PHP

namespace App\Helpers;

class Gzip
{

    public static function unzip($filePath)
    {
        $outFilePath = str_replace('.gz','',$filePath);

        // Open our files (in binary mode)
        $file = gzopen($filePath,'rb');
        $outFile = fopen($outFilePath,'wb');

        // Keep repeating until the end of the input file
        while (!gzeof($file)) {
            // Read buffer-size bytes
            // Both fwrite and gzread and binary-safe
            fwrite($outFile,gzread($file,4096));
        }

        // Files are done,close files
        fclose($outFile);
        gzclose($file);
    }
}

这应该会导致解压文件

Gzip::unzip('path/to/file.csv.gz');

这就是它变得棘手的地方,有时它会解压缩文件,有时它会抛出这个异常; (请记住,这与 StreamHandler 本身无关,这是一个纯输入/输出错误问题)

exception fwrite

我可以根据需要多次刷新页面,但不会有任何改变,如果我在命令行上尝试 gunzip 命令,它将失败并显示相同的错误

gunzip error

现在,如果我多次运行 gunzip 命令也没有关系,但就像我说的这些异常/错误随机发生的,所以它们也会随机地自行“修复”它们。

该应用程序使用 Laravel 8.0、PHP7.4 编写,在 Homestead 环境 (Ubuntu 18.04.5 LTS) 上运行,我的基本笔记本电脑在 Windows 10 上运行。

对我来说,这个异常/错误随机发生的,并且随机地“修复”自己,这太奇怪了,所以我的问题是:这是怎么发生的,为什么会发生这种情况,最终我该如何修复它。

>

解决方法

errno=5 Input/output error 是读/写 Linux 文件系统失败。

真正的服务器,需要用fsck等检查磁盘...

Homestead 在 Windows 上运行,我认为我们应该寻找 windows 10 homestead errno -5 问题。

winnfsd - https://github.com/winnfsd/vagrant-winnfsd/issues/96#issuecomment-336105685

,

如果你在 Windows 上的 Vagrant 使用的是 VirtualBox,HyperV 可以处理这个。

尝试在 powershell 上禁用 VirtualBox 的 HyperV,然后重新启动 Windows

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor

问候

,

问题在于我使用 Homestead(一个 Vagrant 盒子)并打开 NFS,Vagrant + NFS + Windows = 问题。这个问题有很多可能的解决方案,大多数关于 errno5 的例外都归结为 NFS + Vagrant。

我的解决方案是停止使用 NFS,现在这将是公认的答案,因为这解决了我的问题。但是,如果有人设法找到此错误的实际解决方案,我会接受。

,

我解决了它并且我继续使用 NFS。

这种情况通常发生在我删除数据库模式或创建新模式并在我的虚拟机上填充大量数据时。我说的是大约 50 兆字节的卷。我想这足以让 virtual box 开始重新缩放虚拟硬盘,它让 Ubuntu 疯狂和内核恐慌。

因此,解决方案是重新启动 vagrant 以解决问题。

这通常对我有用:

  • make vagrant halt - 它会出错
  • 然后 vagrant up - 它可能行不通
  • 他们vagrant halt - 它可能会再次出错
  • 然后 vagrant up --provision - 这需要时间并且可能还会出错
  • 然后 vagrant halt - 这次应该可以了
  • 然后 vagrant up --provision - 因为“为什么不再次配置它”并且通常就足够了。

10 个案例中有 9 个就足够了。当它不够时,我就创建一个新的家园。