PHP / Symfony3内存泄漏下载图像

时间:2017-03-07 21:12:13

标签: php parsing memory-leaks symfony

我正在开发产品解析器,我需要为每个产品下载相关图像。我有一项服务(我正在使用Symfony 3)来完成这项任务。主要方法是:

public function getMediaFromUrl($img) {
    $info = getimagesize($img);
    $size = $this->_remoteImageSize($img);
    $size = $size / 1000;
    $image = false;
    if ($size < 500) {
        $extension = image_type_to_extension($info[2]);
        //$binaryImageContent = file_get_contents($img);
        $imageFilename = $this->generateImageFilename($extension);
        $imagePath = $this->webFolder."/" . $imageFilename;
        //file_put_contents($imagePath, $binaryImageContent);
        copy($img,$imagePath);
        $image = $this->mediaManager->create();
        $image->setBinaryContent($imagePath);
        $image->setContext('product');
        $image->setProviderName('sonata.media.provider.image');
        $this->mediaManager->save($image);
        //unset($binaryImageContent);
    }
    return $image;
}

private function _remoteImageSize($url) {
    $filesize = false;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
    curl_exec($ch);
    $filesize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    curl_close($ch);
    return $filesize;
}

我必须解析的XML有近10,000种产品。在每次迭代中,我打印memory_get_usage(),因为每次我尝试运行解析时,我得到内存不足错误

69694232
69755032
69961544
70171160
70380840
70525528

正如你所看到的那样,它会一直浪费到浪费128Mb并抛出内存异常。解析器的其他部分工作正常,因为如果我评论这部分它没有任何异常结束(并且内存保持在32029328附近)。我无法弄清楚我做错了什么。

我使用php copy()函数获取图像,然后生成关联实体(SonataMedia)以将其持久化到数据库。每20次迭代我做以下事情:

 if ($count % $this->batchSize == 0) {
     $this->em->flush();
     $this->em->clear();
     gc_collect_cycles();
 }

所以我没有理论导致泄漏(正如我之前所说的,如果我评论函数以获得图像效果很好)。

对此问题的任何想法都将不胜感激。

0 个答案:

没有答案