Php $em->;上的未定义索引错误;Symfony2中的clear()

Php $em->;上的未定义索引错误;Symfony2中的clear(),php,symfony,unit-of-work,undefined-index,memory-limit,Php,Symfony,Unit Of Work,Undefined Index,Memory Limit,我已经编写了一个Symfony命令来从API导入一些数据。它可以工作,但问题是当我在数据库中插入一个大的JSON时,我的PHP内存使用量增加了。每次导入活动后,我的单位工时将增加“2” 我已经取消设置了所有使用过的对象,并且我已经阅读了Symfony2的文档,您需要执行大规模批处理: 但是当我使用$em->clear()时,我的实体管理器会出现以下错误: 注意:未定义的索引:00000000 7B56EA7100000000E366C259,路径为application\vendor\doctr

我已经编写了一个Symfony命令来从API导入一些数据。它可以工作,但问题是当我在数据库中插入一个大的JSON时,我的PHP内存使用量增加了。每次导入活动后,我的单位工时将增加“2”

我已经取消设置了所有使用过的对象,并且我已经阅读了Symfony2的文档,您需要执行大规模批处理:

但是当我使用
$em->clear()
时,我的实体管理器会出现以下错误:

注意:未定义的索引:00000000 7B56EA7100000000E366C259,路径为application\vendor\doctrine\lib\doctrine\ORM\UnitOfWork.php第2228行

这是我的完整代码:

 /**
 * @see Command
 */
protected function configure() {
  $this
    ->setName('ks:user:runkeepersync')
    ->setDescription('Synchroniser les activités d\'un utilisateur runkeeper')
    ->setDefinition(array(
      new InputArgument('access_token', InputArgument::REQUIRED, 'Access token'),
    ))
}

/**
 * @see Command
 */
protected function execute(InputInterface $input, OutputInterface $output) {
  $accessToken = $input->getArgument('access_token');
  $em = $this->getContainer()->get('doctrine')->getEntityManager();
  $UserHasServices = $em->getRepository('KsUserBundle:UserHasServices')->findOneByToken($accessToken);
  if (!is_object($UserHasServices) ) {
    echo "Impossible de trouver l'utilisateur qui possède le jeton ".$accessToken."";
  }
  $user    = $UserHasServices->getUser();
  $service = $UserHasServices->getService();
  echo "avant de requérir l'api : ".memory_get_usage()."\n";
  try {
    $rkApi = $this->getContainer()->get('ks_user.runkeeper');
    $rkApi->setAccessToken($accessToken);
    $activities  = $rkApi->getFitnessActivities(0,25);
    $nbParPages  = 25;
    $nomberActivitites = $activities->size;
    $aActivities = $activities->items;
    $nbPages =  floor ($nomberActivitites/$nbParPages);
    $aEndurance = array("Running", "Cycling", "Mountain Biking", "Walking", "Hiking", "Downhill Skiing", "Cross-Country Skiing", "Snowboarding", "Skating","Wheelchair", "Rowing", "Elliptical", "Other");
    $aEnduranceUnderWater = array("Swimming");
    $enduranceOnEarthType = $em->getRepository('KsActivityBundle:SportType')->findOneByLabel("endurance");
    if (!is_object($enduranceOnEarthType) ) {
      echo "Impossible de trouver le type de sport d'endurance";
    }
    $enduranceUnderWaterType = $em->getRepository('KsActivityBundle:SportType')->findOneByLabel("endurance_under_water");
    if (!is_object($enduranceUnderWaterType) ) {
      echo "Impossible de trouver le type de sport d'endurance sous l'eau ";
    }
    echo "Après avoir récupéré 25 activités : ".memory_get_usage()."\n";
    $a = 0;
    for($i=0;$i<=$nbPages;$i++){
      if($i!=0){
        $activities  = $rkApi->getFitnessActivities($i,25);
        $aActivities = $activities->items;
      }
      foreach ($aActivities as $activity) {
        $a = $a+1;
        $codeSport = $this->formatNameSport($activity->type);
        $sport = $em->getRepository('KsActivityBundle:Sport')->findOneByCodeSport($codeSport);
        if (!is_object($sport) ) {
          $sport = new \Ks\ActivityBundle\Entity\Sport();
          $sport->setLabel($codeSport);
          $sport->setCodeSport($codeSport);
          $sport->setSportType($enduranceOnEarthType);
          $em->persist($sport);
          $em->flush();
        }
        $activityDetail = json_decode($rkApi->requestJSONHealthGraph($activity->uri));
        if(in_array($activity->type, $aEndurance)){
          $urlActivitieDetail = $activityDetail->activity;
          $ActivitySessionEnduranceOnEarth = new \Ks\ActivityBundle\Entity\ActivitySessionEnduranceOnEarth($user);
          isset($activity->total_distance)? $ActivitySessionEnduranceOnEarth->setDistance($activity->total_distance) : "";
          isset($activity->duration)? $ActivitySessionEnduranceOnEarth->setDuration($this->secondesToTimeDuration($activity->duration)) : "";
          isset($activity->start_time)?  $ActivitySessionEnduranceOnEarth->setIssuedAt(new \DateTime($activity->start_time)) : "";
          $ActivitySessionEnduranceOnEarth->setModifiedAt(new \DateTime('Now'));
          $ActivitySessionEnduranceOnEarth->setSport($sport);
          isset($activityDetail->total_calories)?  $ActivitySessionEnduranceOnEarth->setCalories($activityDetail->total_calories) : "";
          isset($activityDetail->climb)?  $ActivitySessionEnduranceOnEarth->setElevationGain($activityDetail->climb) : "";
          $maxElevation = 0;
          $minElevation = 10000;
          if(isset($activityDetail->path)){
            foreach($activityDetail->path as $gpsPoint){
              if($gpsPoint->altitude > $maxElevation){
                $maxElevation = $gpsPoint->altitude;
              }
              if($gpsPoint->altitude < $minElevation){
                $minElevation = $gpsPoint->altitude;
              }
            }
            $ActivitySessionEnduranceOnEarth->setElevationMin($minElevation);
            $ActivitySessionEnduranceOnEarth->setElevationMax($maxElevation);
          }
          $em->persist($ActivitySessionEnduranceOnEarth);
          $em->flush();
          //Pour chaque activité on a un identifiant relatif au service qu'on synchronise
          $ActivityComeFromService = new \Ks\ActivityBundle\Entity\ActivityComeFromService();
          $ActivityComeFromService->setActivity($ActivitySessionEnduranceOnEarth);
          $ActivityComeFromService->setService($service);
          $ActivityComeFromService->setIdWebsiteActivityService($activity->uri);
          $ActivityComeFromService->setSourceDetailsActivity($rkApi->requestJSONHealthGraph($activity->uri));
          $ActivityComeFromService->setTypeSource("JSON");
          $em->persist($ActivityComeFromService);
          $em->flush();
          echo "Import de l'activite num ".$a." type :".$activity->type." effectue avec success \n";
          unset($ActivitySessionEnduranceOnEarth);
          unset($ActivityComeFromService);
          echo "UnitOFWOrk -> ".$em->getUnitOfWork()->size()."\n";
        }
        if(in_array($activity->type, $aEnduranceUnderWater)){
          $ActivitySessionEnduranceUnderWater = new \Ks\ActivityBundle\Entity\ActivitySessionEnduranceUnderWater($user);
          isset($activity->total_distance)? $ActivitySessionEnduranceUnderWater->setDistance($activity->total_distance) : "";
          isset($activity->duration)? $ActivitySessionEnduranceUnderWater->setDuration($this->secondesToTimeDuration($activity->duration)) : "";
          isset($activity->start_time) && !empty($activity->start_time)?  $ActivitySessionEnduranceUnderWater->setIssuedAt(new \DateTime($activity->start_time)) : "";
          $ActivitySessionEnduranceUnderWater->setModifiedAt(new \DateTime('Now'));
          $ActivitySessionEnduranceUnderWater->setSport($sport);
          isset($activityDetail->total_calories)?  $ActivitySessionEnduranceUnderWater->setCalories($activityDetail->total_calories) : "";
          isset($activityDetail->notes)?  $ActivitySessionEnduranceUnderWater->setDescription($activityDetail->notes) : "";
          $em->persist($ActivitySessionEnduranceUnderWater);
          $em->flush();
          $ActivityComeFromService = new \Ks\ActivityBundle\Entity\ActivityComeFromService();
          $ActivityComeFromService->setActivity($ActivitySessionEnduranceUnderWater);
          $ActivityComeFromService->setService($service);
          $ActivityComeFromService->setIdWebsiteActivityService($activity->uri);
          $ActivityComeFromService->setSourceDetailsActivity($rkApi->requestJSONHealthGraph($activity->uri));
          $ActivityComeFromService->setTypeSource("JSON");
          $em->persist($ActivityComeFromService);
          $em->flush();
          echo "Import de l'activité num ".$a." type :".$activity->type." effectué avec succès\n";
          unset($ActivitySessionEnduranceUnderWater);
          unset($ActivityComeFromService);
        }
        echo "Après chaque activité : ".memory_get_usage()."\n";
        unset($sport);
        unset($activityDetail);
        $em->clear();
      }
    }
  } catch (\Exception $e) {
    throw $e;
  }
}
/**
*@see命令
*/
受保护的函数配置(){
美元这个
->setName('ks:user:runkeepersync')
->setDescription('同步器未使用我们的runkeeper')
->集合定义(数组)(
新的InputArgument('access_token',InputArgument::REQUIRED',access token'),
))
}
/**
*@see命令
*/
受保护的函数执行(InputInterface$input,OutputInterface$output){
$accessToken=$input->getArgument('access_token');
$em=$this->getContainer()->get('doctrine')->getEntityManager();
$UserHasServices=$em->getRepository('KsUserBundle:UserHasServices')->findOneByToken($accessToken);
如果(!is_对象($UserHasServices)){
回音“不可能的利用率”$accessToken“;
}
$user=$UserHasServices->getUser();
$service=$UserHasServices->getService();
echo“avant de requérir l'api:”.memory_get_usage()。“\n”;
试一试{
$rkApi=$this->getContainer()->get('ks_user.runkeeper');
$rkApi->setAccessToken($accessToken);
$activities=$rkApi->getFitnessActivities(0,25);
$nbParPages=25;
$NomberActivities=$activities->size;
$aaActivities=$activities->items;
$nbPages=底价($nomberavitites/$nbParPages);
$aEndurance=数组(“跑步”、“骑自行车”、“山地自行车”、“步行”、“徒步”、“下坡滑雪”、“越野滑雪”、“滑雪板”、“滑冰”、“轮椅”、“划船”、“椭圆机”、“其他”);
$aEnduranceUnderWater=阵列(“游泳”);
$enduranceOnEarthType=$em->getRepository('KsActivityBundle:SportType')->findOneByLabel(“耐力”);
如果(!is_对象($enduranceOnEarthType)){
呼应“不可能的运动耐力”;
}
$enduranceUnderWaterType=$em->getRepository('KsActivityBundle:SportType')->findOneByLabel(“水下耐力”);
如果(!是_对象($enduranceUnderWaterType)){
呼应“不可能的耐力运动”;
}
echo“Après avoir récupéré25活动:”.memory_get_usage()。“\n”;
$a=0;
对于($i=0;$igetFitnessActivities($i,25);
$aaActivities=$activities->items;
}
foreach($A活动作为$activity){
$a=$a+1;
$codeSport=$this->formatNameSport($activity->type);
$sport=$em->getRepository('KsActivityBundle:sport')->findOneByCodeSport($codeSport);
如果(!is_object($sport)){
$sport=new\Ks\ActivityBundle\Entity\sport();
$sport->setLabel($codeSport);
$sport->setCodeSport($codeSport);
$sport->setSportType($enduranceOnEarthType);
$em->persist($sport);
$em->flush();
}
$activityDetail=json_decode($rkApi->requestJSONHealthGraph($activity->uri));
if(在数组中($activity->type,$aEndurance)){
$URLRActivityDetail=$activityDetail->activity;
$ActivitySessionEnduranceOnEarth=new\Ks\ActivityBundle\Entity\ActivitySessionEnduranceOnEarth($user);
isset($activity->total_distance)?$ActivitySessionEnduranceOneEarth->setDistance($activity->total_distance):“”;
isset($activity->duration)?$ActivitySessionEnduranceOneEarth->setDuration($this->secondesToTimeDuration($activity->duration)):“”;
isset($activity->start_time)?$ActivitySessionEnduranceOnEarth->setIssuedAt(new\DateTime($activity->start_time)):“”;
$ActivitySessionEnduranceOnEarth->setModifiedAt(new\DateTime('Now'));
$ActivitySessionEnduranceOnEarth->setSport($sport);
isset($activityDetail->total_Carries)?$ActivitySessionEnduranceOneEarth->SetCarries($activityDetail->total_Carries):“”;
isset($activityDetail->Gramb)?$ActivitySessionEnduranceOneEarth->setElevationGain($activityDetail->Gramb):“”;
$maxElevation=0;
$minElevation=10000;
如果(设置($activityDetail->path)){
foreach($activityDetail->path as$gpsPoint){
如果($gpsPoint->高度>$maxElevation){
$maxElevation=$gpsPoint->高度;
}
如果($gpsPoint->高度<$minElevation){
$minElevation=$gpsPoint->高度;
}
}
$ActivitySessionEnduranceOneEarth->setElevationMin($minElevation);
$ActivitySessionEnduranceOnEarth->setElevationMax($maxElevation);
}
$em->persist($ActivitySessionEnduranceOneEarth);
$em->flush();
//在联合国身份证上开展活动,并提供同步服务
$ActivityComeFromService=new\Ks\ActivityBundle\Entity\ActivityComeFromService();
$ActivityComeFromService->setActivity($ActivitySessionEnduranceOnEarth);
$ActivityComeFromService->setService($service);
$ActivityComeFromService->setIdWebsiteActivityService($activity->uri);
$ActivityComeFromService->setSourceDetailsActivity($rkApi->requestJSONHealthGraph($activity->uri));
$ActivityComeFromService->setTypeSource(“JSON”);
$em->persist($ActivityComeFromService);
$em->flush();
echo“Import de l'activite num.$a.”类型:“$activity->type.“effectue avec success\n”;
取消设置($ActivitySessionEnduranceOneEarth);
未设置($ActivityComeFromService);
$this->getContainer()->get('doctrine')->resetEntityManager();
$em = $this->getContainer()->get('doctrine')->getEntityManager();
// disable logger
$em->getConnection()->getConfiguration()->setSQLLogger(null);
// remove all listeners
foreach ($em->getEventManager()->getListeners() as $event => $listeners) {
    foreach ($listeners as $listener) {
        $em->getEventManager()->removeEventListener($event, $listener);
    }
}
// save and clear
$em->flush();
$em->getUnitOfWork()->clear();
// collect 100 entities and then save them
if (($i % 100) == 0) {
    $em->flush();
    $em->getUnitOfWork()->clear();
}