PHP 在解压缩 GZipped 文件时挂起?

标签 php gzip pipe tar freeze

我正在解压缩 .gz 文件并使用 php 将输出放入 tar 中。 我的代码看起来像

$tar = proc_open('tar -xvf -', array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'a')), &$pipes);
$datalen = filesize('archive.tar.gz');
$datapos = 0;
$data = gzopen('archive.tar.gz', 'rb');
while (!gzeof($data))
{
    $step = 512;
    fwrite($pipes[0], gzread($data, $step));
    $datapos += $step;
}
gzclose($data);
proc_close($tar);

它工作得很好(tar 提取了几个目录和文件),直到压缩文件的一半多一点(根据我的 $datapos),然后脚本将卡在 fwrite($pipes...) 永远行(我等了几分钟才行)。

压缩存档大小为 8425648 字节(8.1M),未压缩存档大小为 36720640 字节(36M)。

因为我没有找到任何考虑类似问题的资源,所以我在这里可能做错了什么?

我正在 2.6.32-5-amd64 Linux 机器上运行 php5-cli 版本 5.3.3-7+squeeze3(使用 Suhosin 0.9.32.1)。

最佳答案

1 => 数组('pipe', 'w')

你有 tar 在标准输出上给你数据(文件名)。您应该清空该缓冲区。 (我通常只是阅读它。)

您还可以将其发送到文件,这样您就不必处理它。

1 => array('file', '[文件列表输出的文件]', 'a')

如果你使用的是 Linux,我喜欢这样做

1 => array('文件', '/dev/null', 'a')

[编辑:一旦它输出足够的内容,它将等待您从标准输出读取,这就是您挂起的位置。]

关于PHP 在解压缩 GZipped 文件时挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230424/

相关文章:

java - 如果使用InputStream从PIPE输入结束,如何使(Java)程序自动结束

php - 按纬度/经度对 MySQL 查询进行排序

javascript - Laravel 5.2 中 Ajax 返回 500 错误

.net - .net 中用于 deflate、gzip 和 zlib 的一个库

windows - 如何在 Apache 2.2.17 上启用 mod_Gzip?

c - 与在命令行上使用文件名进行输入和输出的程序交互的最佳方式是什么?

python - 如何将 python 脚本的输出传输到 Rscript 中?

php - 使用 CSS 和 PHP/MySQL 的动态下拉菜单

php memory_get_peak_usage() 包括 mysql 内存使用情况?

amazon-web-services - GZIP 在 Amazon Cloudfront 中不起作用