以下是我编写的一小段代码:

file_put_contents('a.upl', '');
try
{
    $x = new \ZipArchive();
    $x->open('a.upl');
}
catch(\Exception $e)
{
    echo $e->getMessage();
}

它发出了ZipArchive::open(): Using empty file as ZipArchive is deprecated的信息,这并不令人惊讶. 令人惊讶的是,这个a.upl文件被删除了,这有点奇怪.它为什么要这么做?又如何防止这种"x文件,魔术"?

推荐答案

在来源上做了一些探索,事件的顺序是这样的:

PHP发现您提供的文件是空的,最新版本的libzip不允许这样做,因此在为BC中断做准备时,PHP在调用libzip的zip_open时设置了ZIP_TRUNCATE标志

https://github.com/php/php-src/blob/master/ext/zip/php_zip.c#L1500

收到此标志后,libZip将在内存中创建一个新的Zip对象,并作为源链接到该文件.

当您没有向其中添加任何文件并且脚本退出时,libzip将调用zip_close,并且由于设置了ZIP_TRUNCATE标志并且zip中没有任何条目,因此源文件将被删除.

https://github.com/nih-at/libzip/blob/cf7bf43ba2f85f936705231903aa0d5cfb2fdf11/lib/zip_close.c#L68

通过设置这个全局标志:https://www.php.net/manual/en/zip.constants.php#ziparchive.constants.afl-create-or-keep-file-for-empty-archive(如果您的libzip版本是>;=1.10),您可以避免x文件魔术

Php相关问答推荐

编写WooCommerce多步骤签出

如何将对我的域的请求重定向到子文件夹中的索引,同时保留域URL并使用.htaccess?

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

使用PHP curl的Amazon SP API批处理调用

在Symfony 6.4中将工作流动态添加到服务

Symfony5:如何在不登录的情况下使API路由可访问?

从目录文件夹中获取文件并追加到 Select 下拉列表(选项)-wordpress/wc

PHP文件上载问题-";Move_Uploaded_Files";未按预期工作

PHP SimpleXML:按属性值访问 node

显示 woocommerce 中所选变体的属性术语描述

对产品/库存结果集进行分组和计数,形成多维分层数组

如何在 PHP laravel 中将图像的透明背景转换为白色?

在 Heroku 上部署 Sylius - 路由不正确

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

在WooCommerce购物车和 checkout 页面中更改总计文本

WooCommerce checkout 流程中基于所选选项添加自定义费用

使用 PHP 正则表达式从仅包含具有现有顺序的顶级标签的 XML 文档中搜索和创建数组

WooCommerce 按 ID 限制产品

PHP 中的 curl 验证失败(openssh 连接正常)

根据数组中的文本文件编号显示星级