【问题标题】:PharData limitation of file name lengthPharData 文件名长度限制
【发布时间】:2015-02-16 16:04:41
【问题描述】:

我遇到了PharData 和更长文件名的问题。我得到以下异常:

无法创建基于 tar 的 phar \"2014-07-17-09-22-32.tar\",文件名 \"XXX.99999.YYYYYYYYYYYYYYYY.YYYYYYY.YYYYYYYYYYYYYYYYYYYYYYYYY.5f4a75e7-ee73-49f1-8a27-9440cfb35196 .1405588952.xml\" 对于 tar 文件格式来说太长了

(对不起,不得不加密一点^^)

现在奇怪的是,如果我从命令行使用这个命令,它就像一个魅力:

tar cvf foo.tar XXX.99999.YYYYYYYYYYYYYYYY.YYYYYYY.YYYYYYYYYYYYYYYYYYYYYYYYY.5f4a75e7-ee73-49f1-8a27-9440cfb35196.1405588952.xml

我找不到任何有关 PharData 的信息,这些信息与 TAR 提供的限制不同。有什么可以用于 PharData 的选项吗?非常感谢!

【问题讨论】:

    标签: php tar phar


    【解决方案1】:

    允许文件名超过 100 个字符是 tar 标准的 GNU 扩展。 (ustar)。 PHP 正确处理文件名。

    您可以通过将-o (--old-archive) 选项传递给 GNU tar 来验证这一点,它会引发错误:

    $ tar ocvf foo.tar XXX.99999.YYYYYYYYYYYYYYYY.YYYYYYY.YYYYYYYYYYYYYYYYYYYYYYYYY.5f4a75e7-ee73-49f1-8a27-9440cfb35196.1405588952.xml
    tar: XXX.99999.YYYY...588952.xml: file name is too long (max 99); not dumped
    tar: Exiting with failure status due to previous errors
    

    我找到了以下documentation

    GNU tar 基于 POSIX 1003.1 ustar 标准的早期草案。对 tar 的 GNU 扩展,例如对超过 100 个字符的文件名的支持,使用了在 POSIX 草案中指定为未使用的部分 tar 标头记录。 POSIX 中的后续更改已将标题记录的相同部分分配给其他目的。结果,GNU tar 与当前的 POSIX 规范以及遵循它的 tar 程序不兼容。


    顺便说一句,这个限制是由这个提交添加到 PHP 中的:https://github.com/php/php-src/commit/667c59abd697d5d80cb0cadf6a5cb7d94dee3a22

    提交是因为以下错误报告:https://bugs.php.net/bug.php?id=49020

    【讨论】:

    • 非常好的信息收集!这确实看起来很有趣(如果有人能笑这样的话……)。好吧,但这意味着我们将不得不简单地不使用长文件名并使用另一种方式传递元数据。感谢您的澄清!
    • 是的,到目前为止我们还不能使用长文件名。需要补充一点,像 ö.txt 这样的 unicode 文件名根本不受支持。我敢肯定这是有原因的。如果它太容易,那么 PHP 开发人员就不会这样做了。需要找出这个原因..
    • @Sam 我已经调查过这个话题。无法相信这是 PHP 中的错误。我可以发现,支持超过 100 个字符的文件名是 GNU tar 扩展而不是标准。 PHP版本可以,文件名只能100个字符,整个路径+文件名255个字符,路径155个字符。
    • 对于较旧的 tar 版本确实如此。显然,它依赖于许多因素。较新的 TAR(在文件系统上)允许文件名超过 100 个字符,但旧版本不允许。我们通过散列文件名并通过其他方式发送元信息以在提取后在本地重命名文件名来解决问题。不过感谢您提供此信息!
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2011-09-28
    • 2011-05-29
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多