Clean up tar process handling; make stdout non-blocking.
This commit is contained in:
parent
2bb29d7224
commit
5a51778a6a
@ -42,8 +42,8 @@ class Download
|
|||||||
}
|
}
|
||||||
|
|
||||||
$descriptorspec = [
|
$descriptorspec = [
|
||||||
0 => ['pipe', 'r'],
|
0 => ['pipe', 'r'], // STDIN
|
||||||
1 => ['pipe', 'w'],
|
1 => ['pipe', 'w'], // STDOUT
|
||||||
];
|
];
|
||||||
|
|
||||||
$command = 'tar -cf - -C ' . escapeshellarg(ASSETSDIR) . ' --null -T -';
|
$command = 'tar -cf - -C ' . escapeshellarg(ASSETSDIR) . ' --null -T -';
|
||||||
@ -59,22 +59,33 @@ class Download
|
|||||||
if(!$pipes[1])
|
if(!$pipes[1])
|
||||||
throw new UnexpectedValueException('Could not open pipe for STDOUT');
|
throw new UnexpectedValueException('Could not open pipe for STDOUT');
|
||||||
|
|
||||||
$album_name = $album->tag;
|
// STDOUT should not block.
|
||||||
|
stream_set_blocking($pipes[1], 0);
|
||||||
|
|
||||||
header('Pragma: no-cache');
|
header('Pragma: no-cache');
|
||||||
header('Content-Description: File Download');
|
header('Content-Description: File Download');
|
||||||
header('Content-disposition: attachment; filename="' . $album_name . '.tar"');
|
header('Content-disposition: attachment; filename="' . $album->tag . '.tar"');
|
||||||
header('Content-Type: application/octet-stream');
|
header('Content-Type: application/octet-stream');
|
||||||
header('Content-Transfer-Encoding: binary');
|
header('Content-Transfer-Encoding: binary');
|
||||||
|
|
||||||
|
// Write filenames to include to STDIN, separated by null bytes.
|
||||||
foreach ($files as $file)
|
foreach ($files as $file)
|
||||||
fwrite($pipes[0], $file . "\0");
|
fwrite($pipes[0], $file . "\0");
|
||||||
|
|
||||||
|
// Close STDIN pipe to start archiving.
|
||||||
fclose($pipes[0]);
|
fclose($pipes[0]);
|
||||||
|
|
||||||
while($chunk = stream_get_contents($pipes[1], 4096))
|
do
|
||||||
echo $chunk;
|
{
|
||||||
|
// Read STDOUT as `tar` is doing its work.
|
||||||
|
echo stream_get_contents($pipes[1], 4096);
|
||||||
|
|
||||||
|
// Are we still running?
|
||||||
|
$status = proc_get_status($proc);
|
||||||
|
}
|
||||||
|
while (!empty($status) && $status['running']);
|
||||||
|
|
||||||
|
// Close STDOUT pipe and clean up process.
|
||||||
fclose($pipes[1]);
|
fclose($pipes[1]);
|
||||||
|
|
||||||
proc_close($proc);
|
proc_close($proc);
|
||||||
|
Loading…
Reference in New Issue
Block a user