PHP8 从函数返回 ZipArchive getStream 会关闭包含的 zip 存档

PHP8 returning ZipArchive getStream from a function makes the containing zip archive to be closed

提问人:Justin 提问时间:10/2/2023 最后编辑:Chris HaasJustin 更新时间:10/2/2023 访问量:62

问:

private function getFilePointer($file)
    {
        $pathInfo = pathinfo($file);

        $zip = new ZipArchive();
        if (($res = $zip->open($file)) !== true) {
            throw new Exception("error");
        }

        $fileName = preg_replace('/\d+/', '', str_replace('.zip', '.csv', $pathInfo['basename']));

        if (!($stream = $zip->getStream($fileName))) {
                throw new Exception("error");
        }

        return $stream;
    }

如果使用以下函数获取 zip 流并在其中使用它会产生错误$row = fgetcsv($stream)

PHP Error[2]: fgetcsv(): Zip stream error: Containing zip archive was closed

如果使用 $zip->getStream($fileName) 在与您尝试读取的相同函数中,它不会抛出错误。$row = fgetcsv($stream)

似乎这种行为从 php7.4 开始发生了变化,但我找不到任何关于它的文档。

有谁知道如何解决这个问题,以便可以从函数返回流并仍然使用?

ziparchive php-8 php-7.4

评论

0赞 Chris Haas 10/2/2023
我可以确认在 PHP 8.1 和 8.2 中,我收到了您看到的异常,而 7.4 和 8.0 没有显示任何问题。我的步骤复制在这里:3v4l.org/oALrq。我可以在这里看到一些关于一些流变化的喋喋不休,但我无法判断它是否 100% 相关。

答: 暂无答案