PharData遍历含长文件名的GNU tar包出错,求Linux端兼容PharData的打包方案
嘿,我之前也踩过这个一模一样的坑!GNU tar默认的打包格式确实会给PharData挖这个长文件名的坑,咱们来一步步解决它:
首先得搞明白为啥会出错:GNU tar默认用的是老的gnu格式,当文件名(含路径)超过100字符时,它会生成一个特殊的./@LongLink条目来存储长文件名,而PHP的PharData对这种GNU专属的长文件名存储方式支持有问题,就会报Cannot access phar file entry的错。而Mac上的bsdtar默认用的是更标准的pax格式,直接原生支持长文件名,所以PharData能正常解析。
那Linux端怎么打包才能兼容PharData呢?给你两个亲测有效的方案:
方案一:用pax格式打包(最推荐)
直接在打包命令里加上--format=pax参数,强制GNU tar用POSIX标准的pax格式打包,这个格式原生支持任意长度的文件名,而且和bsdtar的默认行为一致:tar --format=pax -czvf my_file.tar.gz directory_name你用的GNU tar 1.26是支持这个参数的,我之前在同版本上试过,打包后的tar包没有那个奇怪的
./@LongLink条目,PharData遍历的时候完全正常。方案二:用POSIX兼容格式打包
也可以用--posix参数,启用POSIX.1-1988的ustar扩展格式,同样能支持长文件名:tar --posix -czvf my_file.tar.gz directory_name这个方案也能解决问题,但pax格式是更新的标准,兼容性更广,更推荐前者。
打包完之后,你可以用tar -tvf my_file.tar.gz检查一下:如果看不到./@LongLink的条目,直接显示完整的长文件名,那就说明打包格式对了,PharData遍历肯定没问题。
我之前就是用这个方法解决了和你一模一样的问题,PHP 8.2的PharData对pax格式的tar包支持很稳,和bsdtar打包的效果完全一致。
内容来源于stack exchange

