【问题标题】:Why won't PHP create this zip file (permissions issue)为什么 PHP 不会创建这个 zip 文件(权限问题)
【发布时间】:2011-01-11 14:39:56
【问题描述】:
  • 我在窗户上

  • 我正在使用 PHING 压缩一些文件

  • 我有很多东西被压缩了

  • 压缩有效,但压缩文件中包含特定 phing 文件集的压缩文件除外

  • 调试时,我可以在 phing 的 ZIP 任务中看到 ZipArchive::close 返回 false。错误字符串显示为“权限被拒绝”。在手册中,它指出 close() 是实际写入文件的内容。

  • 这不是时间耦合,换句话说,无论这个是第一个、最后一个还是其他什么,它都会发生。所有其他的工作。这个好像没有什么不同。

这是我的构建文件:http://pastebin.org/84786(有效期为一个月)

问题出在第 251 行。它之前和之后的 zip 任务都可以正常工作。在调试器中,我可以看到大约 150 个文件被添加到 zip 中。我已经在调试器中验证了所有路径都是正确的。

构建似乎在 linux 上运行良好。

当我右键单击 zip 文件所在的文件夹时,只读复选框“蓝出”,未选中或未选中。无论我是选中还是取消选中它,然后按确定并返回文件夹的属性,复选框再次为“蓝色”。显然这是设计使然 (http://support.microsoft.com/kb/326549),这似乎不是问题,因为它只发生在那个文件中。

另一件奇怪的事情是,如果我转到第 252 行并将文件集更改为指向,例如,它正上方的“导入器”模块中的文件,它会创建 zip。但是,第 236 行的 .tar.gz 证明每次都可以正常工作。所以它只发生在为 zip 任务设置的特定文件中。该文件集适用于 tar 任务。事实上,在它下面的“包”cmets 下所有引用这些文件的任务都不会被创建,但是 tar.gz 文件会。

什么给了?

另外:新的观察结果......如果我刷新文件视图足够快,我可以看到 myzipfile.zip.tmp 正在构建,但 myzipfile.zip 永远不会被创建。

在 linux 上,我只是仔细检查了一切是否正常工作。去图吧。

【问题讨论】:

  • 这听起来确实像是windows文件系统权限问题,尝试为整个/build/递归设置新权限,并专门为所有用户添加权限(仅用于调试)。
  • 如前所述,我已经尝试切换只读状态。对于源目录和构建目录,我都去确保所有用户都允许每个权限。在这个问题上没有任何改变。感谢您的输入
  • 您是否使用简单的 PHP 脚本进行检查,例如。使用 fwrite(),是否允许 PHP 网络用户在该目录中写入?似乎是这样,因为你可以使用 tar.gz,但这将是一个小测试。
  • 我在 $zip->close() 上写了一个断点(phing 中 ZipTask.php 的第 201 行)。 is_writable(dirname($this->zipFile->getAbsolutePath())) 计算结果为真。 (如果你没有按照我正在做的事情,我要求提供 .zip 文件的完整路径的父目录并检查它是否存在并且可写。PHP 说它是。
  • Pastebin 已删除代码...

标签: php file-permissions phing ziparchive


【解决方案1】:

根据您的新观察,听起来问题与将 TMP 文件重命名为真正的 ZIP 文件有关。要么存在文件名问题,要么存在某种延迟写入问题,在重命名时文件尚未完全完成。

【讨论】:

  • umm .. 您可以尝试看看在 ZIP 文件写入之前放置睡眠功能会发生什么,或者看看当您更改要写入的文件名或目录时会发生什么-压缩文件。没有进一步调试,我真的没有眼睛和耳朵......
  • ZipArchive 类是一个 php 扩展(zlib 的包装器)。调试中断(); $zip->close();这就是代码的样子。只要我越过那条线,就会创建 tmp 文件,然后将其删除。 sleep() 除了之前或之后无处可去(这是毫无意义的,它已经“休眠”了,因为 GUI 调试的工作原理就是这样)
【解决方案2】:

我没有看到有问题的代码,但我遇到了类似的问题。这是由于代码使用正斜杠而不是反斜杠而发生的。我改变了斜线,不得不转义它们(\\)。不知道这是否有帮助,但有时是小事导致了最大的问题。

【讨论】:

    【解决方案3】:

    根据你所说的它在 Linux/Unix 上的工作,我猜你受到了文件系统/锁定语义上的差异的影响。在 Unix 中,文件只是自愿锁定的(其他程序在没有“锁定意识”时仍然可以读取它们)。在 Windows 中,锁定是由操作系统强制执行的,这意味着如果它们正在被另一个程序使用,则您无法读取所有文件,当然也不能删除它们(您必须收到该文件的错误消息)。如果我不得不猜测,您正在尝试压缩一个被活动进程锁定的文件并且它失败了。 (当您的其他 zip 操作正常工作时,我假设写入不是问题,并且您有足够的磁盘空间/配额(并且不会在 FAT 文件系统上写入大于 2GB 的文件))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多