|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-10-21 07:57 UTC] nodkz at mail dot ru
Description:
------------
I need add 100 000 files to phar arhive.
First 1000 files insert very quick. But when I insert from 9000 to 10000, it works about 20 minutes.
I found that every changes writes to disk. In documentation I so buffering operation to maket set of change, before writing to disk. If I run startBuffering()/stopBuffering() commands.
So I try to run startBuffering() on PHP 5.2.11 - it doesn't work.
So I install PHP5.3.1RC2 - it doesn't work again.
Reproduce code:
---------------
$phar = new Phar('test.phar');
$phar->startBuffering();
var_dump($phar->isBuffering());
for($i=0;$i<100000;$i++) {
// write data in files XXX/XXX.txt
$phar->addFromString( floor($i/1000).'/'.($i%1000).'txt', 'some data');
}
$phar->stopBuffering();
Expected result:
----------------
Expect to see
bool(true)
Actual result:
--------------
But scripts shows:
bool(false)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 21:00:01 2025 UTC |
The only bug is that Phar::isBuffering() has its values inverted. It is not performant to use the buffering feature for extremely large phar archives. Instead, use this code: <?php mkdir(__DIR__ . '/fillit'); for($i=0;$i<100000;$i++) { // write data in files XXX/XXX.txt @mkdir(__DIR__ . '/fillit/' . floor($i/1000)); file_put_contents(__DIR__ . '/fillit/' . floor($i/1000).'/'.($i%1000).'txt', 'some data'); echo $i,"\n"; } echo "building\n"; $phar = new Phar('test1.phar'); $a = time(true); $phar->buildFromDirectory(__DIR__ . '/fillit'); $b = time(true); echo "done in ", $b - $a, " seconds\n"; echo count($phar),"\n"; ?> I get 100000 files added in approximately 118 seconds. The code you supplied takes well over that just for the first 10000 files.