【发布时间】:2021-04-10 15:46:27
【问题描述】:
我之前有 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 本身无关,这是一个纯粹的输入/输出错误问题)
我可以根据需要多次刷新页面,但不会有任何改变,如果我在命令行上尝试gunzip 命令,它将失败并排除相同的错误;
- 我解压哪个文件无关紧要,它随机发生在一个随机文件中。
现在,如果我多次运行 gunzip 命令也没关系,但就像我说的这些异常/错误是随机发生的,所以它们也会随机地自行“修复”它们。
该应用程序是用 Laravel 8.0 编写的,PHP7.4 在 Homestead 环境(Ubuntu 18.04.5 LTS)上运行,我的基本笔记本电脑在 Windows 10 上运行。
对我来说,这个异常/错误是随机发生的,而且是随机发生的,而且会随机地“修复”自身,这非常奇怪,所以我的问题是:这是怎么发生的,为什么会发生,最终我该如何修复它。
p>【问题讨论】:
-
fopen 可能会失败,您需要检查一下。应该是文件或文件夹权限问题。
-
@TylerMiles 是否与
gunzip命令本身有任何关联? -
如果您使用的是同一个文件,您可能会在它仍在使用时尝试使用它并收到此错误。
-
@apokryfos 但为什么首先会出现异常?
-
很难说,我建议在 repo 上向开发人员提出问题(希望在 git 上)。在循环中运行 try catch 以在失败时重试......有一个最大重试次数的计数器。即使进程因信号而停止,您的资源也不应关闭。在处理套接字资源或启动 MySQL 连接时,我在自己的部分代码中执行此操作。
标签: homestead nfs vagrant-windows