0

我有一个我无法解决的问题。我有一个复制小图像文件的脚本。问题是对于一个图像变体,它大约需要 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
4

3 回答 3

2

我今天发现,如果托管公司限制服务器上的 I/O 速率,您可以在共享服务器上运行它。我与我的托管公司在 Linux 上进行了此操作,限制为 1 MB/s(以保护服务器上的其他帐户)。因此,如果您有 10 MB 的文件要复制,如果速率为 1 MB/s,您将在脚本执行时间上增加 10 秒。

PHP 本身并没有什么问题。我发现使用 exec 和 cp 命令对速度没有真正的影响。


我应该补充一点,如果您需要定期复制大文件,您应该从共享主机包升级。

于 2015-10-27T15:12:58.277 回答
0

经过多次尝试,我注意到当目标文件夹中的文件数达到 1M 时,复制性能会急剧下降。可能是 NTFS 有问题。我禁用了 Windows 搜索服务,所以这不是原因。我也在 Linux 服务器上用 SSD 尝试过,结果相同。似乎文件的数量对复制性能有影响。

于 2013-08-12T23:33:59.010 回答
0

尝试使用类似xdebug的方式分析您的脚本。这样,您就可以准确判断是什么导致了脚本中的任何瓶颈。

于 2013-08-10T06:29:14.693 回答