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

问题描述 投票:0回答:1
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($文件名) 与您尝试阅读的功能相同

$row = fgetcsv($stream)
那么它就不会抛出错误。

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

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

php ziparchive php-8 php-7.4
1个回答
0
投票

看起来像垃圾收集问题,可以使用

解决

静态 $zip = new ZipArchive();

© www.soinside.com 2019 - 2024. All rights reserved.