要将文件添加到PHAR存档,请为要添加到PHAR文件的每个文件调用Phar::addFile
。
但是,在向PHAR添加大量文件时(旁注:“PHAR Archive”或“PHAR”?),PHAR创建速度会急剧下降。我使用以下脚本来测量PHP创建包含存储在“Files”子目录中的100个1兆字节(1 000 000字节)文件的PHAR所花费的时间。
<?php
$pathStat = "pharstat.csv";
$pathPhar = "phar.phar";
if (file_exists($pathPhar)) {
unlink($pathPhar);
}
$stat = new SplFileObject($pathStat, "w");
$phar = new Phar($pathPhar);
$phar->startBuffering();
$iterator = new DirectoryIterator(__DIR__ . "/Files");
$start = microtime(true);
foreach ($iterator as $file) {
if ($file->getFilename() != "." && $file->getFilename() != "..") {
$phar->addFile($file->getPathname(), $file->getFilename());
echo "Added " . $file->getPathname() . "\r\n";
$split = microtime(true);
$stat->fwrite(number_format($split - $start, 6) . "\r\n");
}
}
$phar->stopBuffering();
?>
每次将文件添加到PHAR时,脚本都会获取分割时间,并将其输出到“pharstat.csv”文件进行分析。
Here is a link to the data I got. Feel free to peer-review my results.
数据证实,向PHAR添加文件的速度越慢,PHAR中已有的文件就越多。此外,数据表明将 n 文件添加到PHAR中的时间增加了 n ²。
我使用Java的ZIP创建实用程序进行了快速实验,似乎PHP PHAR在 n ²行为中是独一无二的。
所以问题是:为什么PHAR这么慢?无论如何要加速它,理想情况下是 n 行为?