PHP文件缓慢复制

时间:2013-08-10 06:24:02

标签: php copy

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

3 个答案:

答案 0 :(得分:1)

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

PHP没有任何内在错误;我发现使用exec和cp命令对速度没有任何实际影响。

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

答案 1 :(得分:0)

使用profiling等内容尝试xdebug您的脚本。这样,您就可以准确地确定导致脚本出现任何瓶颈的原因。

答案 2 :(得分:0)

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