我正在解压缩 .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/