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

fwrite(): write of XX bytes failed with errno=5 Input/output error

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

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

<?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 本身无关,这是一个纯粹的 input/output 错误问题)

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

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

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

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

errno=5 Input/output error read/write 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

问候

问题在于我使用启用了 NFS 的 Homestead(一个 Vagrant 盒子),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 次就足够了。不够用我就建个新宅基地