我有一个无法解决的问题。我有一个复制小图像文件的脚本。问题是,对于一个图像变体,它大约需要1.5秒。有什么能让它更快吗?我使用的是PHP CLI,我的硬盘是WD VelociRaptor 10K RPM。源文件夹包含大约200K文件
以下是我希望加快的代码部分:
$startCopyVariant = time();
$result = array('uploadedImagesUrls'=>array(), 'errMsg'=>'');
// lazyload class instances
$productOptionImages = &lloader()->getImagesByName("productOption");
// validate image
$imgSizeInfo = @getimagesize($srcImageInfo['tmp_name']);
if (empty($imgSizeInfo)) { $result['errMsg'] = 'Invalid image '.$srcImageInfo['name'].', type '.$srcImageInfo['type']; return $result; }
$ext = pathinfo($srcImageInfo['name'], PATHINFO_EXTENSION);
$variantFileName = 'opt_'.$optionId."_variant.".$ext;
$mainDestFileName = $variantFileName;
$srcFileName = $this->getCropSizeFileName($srcImageInfo['name'], "big");
copy($srcFileName, $productOptionImages->getImagePath().$variantFileName);
$variantFileName = $variantFileName = 'opt_'.$optionId."_variant_sma.".$ext;;
$srcFileName = $this->getCropSizeFileName($srcImageInfo['name'], "small");
copy($srcFileName, $productOptionImages->getImagePath().$variantFileName);
$variantFileName = 'opt_'.$optionId."_variant_thu.".$ext;;
$srcFileName = $this->getCropSizeFileName($srcImageInfo['name'], "thumbnail");
copy($srcFileName, $productOptionImages->getImagePath().$variantFileName);
$variantFileName = 'opt_'.$optionId."_variant_tin.".$ext;;
$srcFileName = $this->getCropSizeFileName($srcImageInfo['name'], "tiny");
copy($srcFileName, $productOptionImages->getImagePath().$variantFileName);
$endCopyVariant = time();
$elapsedTime = $endCopyVariant - $startCopyVariant;
print_r("Variant copy time: (".$srcImageInfo['name']."): ".sprintf('%02d:%02d:%02d', ($elapsedTime/3600),($elapsedTime/60%60), $elapsedTime%60), 0);
感谢。
编辑:以下是getCropsizeFileName:
private function getCropSizeFileName($srcFileName, $size) {
global $sourceCropBasePath;
$ext = pathinfo($srcFileName, PATHINFO_EXTENSION);
$destFileNamePrefix = basename($srcFileName, ".".$ext);
return $sourceCropBasePath.$destFileNamePrefix."_".$size.".".$ext;
}
每个副本行的计时器结果为:
Variant copy time1: (0a46de43f73304469a38137bf3f43c32.jpg): 00:00:02
Variant copy time2: (0a46de43f73304469a38137bf3f43c32.jpg): 00:00:01
Variant copy time3: (0a46de43f73304469a38137bf3f43c32.jpg): 00:00:02
Variant copy time4: (0a46de43f73304469a38137bf3f43c32.jpg): 00:00:01
答案 0 :(得分:1)
如果托管公司限制服务器上的I / O速率,我今天发现您可以在共享服务器上运行此操作。我在Linux上使用我的托管公司进行了此操作,限制为1 MB / s(以保护服务器上的其他帐户)。因此,如果要复制10 MB的文件,如果速率为1 MB / s,则会在脚本执行时添加10秒。
PHP没有任何内在错误;我发现使用exec和cp命令对速度没有任何实际影响。
我应该补充一点,如果你需要定期复制大文件,你应该从共享主机软件包升级。
答案 1 :(得分:0)
答案 2 :(得分:0)
经过多次尝试后,我注意到当目标文件夹中的文件数达到1M时,复制性能会急剧下降。可能有NTFS的东西。我禁用了Windows搜索服务,所以这不是原因。 我也尝试在具有相同结果的SSD的Linux服务器上。似乎文件的数量会影响复制性能。