我正在开发产品解析器,我需要为每个产品下载相关图像。我有一项服务(我正在使用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();
}
所以我没有理论导致泄漏(正如我之前所说的,如果我评论函数以获得图像效果很好)。
对此问题的任何想法都将不胜感激。