Php Symfony2中的条令多次插入超时

Php Symfony2中的条令多次插入超时,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我试图在我的数据库中创建许多相同的对象,更准确地说,插入一些用户。首先,我尝试在每次循环后刷新实体管理器,但没有成功。经过一些研究,我发现我可以批量完成,所以我尝试每15个循环刷新一次,但30秒后仍然超时(大约180个查询)。对于一个小到200-250的数字来说,这些不应该是快速的,或者几乎是瞬间的吗?我如何才能使其不超时并更快地插入 我的函数所做的是向randomuser.me发出请求并检索用户的json。我将该数据检索到一个数组中,并使用它来填充我的用户信息。我还有一个$fields数组,其

我试图在我的数据库中创建许多相同的对象,更准确地说,插入一些用户。首先,我尝试在每次循环后刷新实体管理器,但没有成功。经过一些研究,我发现我可以批量完成,所以我尝试每15个循环刷新一次,但30秒后仍然超时(大约180个查询)。对于一个小到200-250的数字来说,这些不应该是快速的,或者几乎是瞬间的吗?我如何才能使其不超时并更快地插入

我的函数所做的是向randomuser.me发出请求并检索用户的json。我将该数据检索到一个数组中,并使用它来填充我的用户信息。我还有一个$fields数组,其中包含某些医学字段(不会在这里发布,因为它只是一个纯文本数组)。它还为用户条目添加了一个相关的设置条目(包含medic工作的字段和他的图片)


使用批处理方法时,大约有40个用户被添加到我的数据库中,但在达到最大执行时间后,它就会停止。我做错了什么?

使用malcolm的建议使用symfony的客户机命令。不过,该命令仍然运行缓慢。每个用户大约1秒钟。并且每批一次将其插入DB 15中

class GenMedicsCommand extends ContainerAwareCommand
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName('doctrine:generate:medics')
            ->setDescription('Generate medics group, users, group-users, medic settings')
            ->addArgument(
                'number',
                InputArgument::REQUIRED,
                'How many medics to generate?'
            );
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $number = $input->getArgument('number');
        $this->generate($number,$output);

    }


    protected $fields = array(
        'Abdominal Radiology Radiology-Diagnostic',
        'Addiction Psychiatry Psychiatry',
        'Adolescent Medicine Pediatrics'    
    );

    //generate random medics for the win
    public function generate($nr,   OutputInterface $output)
    {


        $em = $this->getContainer()->get('doctrine.orm.entity_manager');
        $doctrine = $this->getContainer()->get('doctrine');

        $generated = 0;

        $url = "https://randomuser.me/api/?results=".$nr."&nat=us";
        $str = file_get_contents($url);
        $medics = json_decode($str);

        $medicsgruop = $doctrine->getRepository('MedAppBundle:Group')->findOneBy(array('name' => 'medics'));

        if (!$medicsgruop) {
            $medicsgruop = new Group('medics');
            $medicsgruop->addRole('ROLE_MEDIC');
            $em->persist($medicsgruop);
            $em->flush();
        }

        $batchSize = 15;
        foreach ($medics->results as $i => $medic) {
         //   set_time_limit(2);


            $randkey = array_rand($this->fields);
            $field = $this->fields[$randkey];

            $fname = $medic->user->name->first;
            $lname = $medic->user->name->last;

            $image = $medic->user->picture->large;
            $email = $medic->user->email;

            $user = new User();
            //user
            $user->setUsername($lname.$fname);
            $user->setFirstname($fname);
            $user->setLastname($lname);
            $user->setEmail($email);
            $user->setEnabled(true);
            $user->setPlainPassword($fname.$lname);
            //group


            $user->addGroup($medicsgruop);

            $em->persist($user);
            //MEDIC SETTINGS
            $medsett = new MedicSettings();
            $medsett->setField($field);
            $medsett->setProfile($image);
            $medsett->setMedic($user);
            $em->persist($medsett);
            $output->write(array($i+1,'|',$fname,'|',$lname,'|',$field,'|',$email,'|',$image));
            $output->writeln('');
            if (($i % $batchSize) == 0) {
                $em->flush();
                //  $em->clear();
            }
        }
        $em->flush();
        $em->clear();


        $output->writeln('done');
    }

}

使用malcolm的建议使用symfony的客户机命令。不过,该命令仍然运行缓慢。每个用户大约1秒钟。并且每批一次将其插入DB 15中

class GenMedicsCommand extends ContainerAwareCommand
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName('doctrine:generate:medics')
            ->setDescription('Generate medics group, users, group-users, medic settings')
            ->addArgument(
                'number',
                InputArgument::REQUIRED,
                'How many medics to generate?'
            );
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $number = $input->getArgument('number');
        $this->generate($number,$output);

    }


    protected $fields = array(
        'Abdominal Radiology Radiology-Diagnostic',
        'Addiction Psychiatry Psychiatry',
        'Adolescent Medicine Pediatrics'    
    );

    //generate random medics for the win
    public function generate($nr,   OutputInterface $output)
    {


        $em = $this->getContainer()->get('doctrine.orm.entity_manager');
        $doctrine = $this->getContainer()->get('doctrine');

        $generated = 0;

        $url = "https://randomuser.me/api/?results=".$nr."&nat=us";
        $str = file_get_contents($url);
        $medics = json_decode($str);

        $medicsgruop = $doctrine->getRepository('MedAppBundle:Group')->findOneBy(array('name' => 'medics'));

        if (!$medicsgruop) {
            $medicsgruop = new Group('medics');
            $medicsgruop->addRole('ROLE_MEDIC');
            $em->persist($medicsgruop);
            $em->flush();
        }

        $batchSize = 15;
        foreach ($medics->results as $i => $medic) {
         //   set_time_limit(2);


            $randkey = array_rand($this->fields);
            $field = $this->fields[$randkey];

            $fname = $medic->user->name->first;
            $lname = $medic->user->name->last;

            $image = $medic->user->picture->large;
            $email = $medic->user->email;

            $user = new User();
            //user
            $user->setUsername($lname.$fname);
            $user->setFirstname($fname);
            $user->setLastname($lname);
            $user->setEmail($email);
            $user->setEnabled(true);
            $user->setPlainPassword($fname.$lname);
            //group


            $user->addGroup($medicsgruop);

            $em->persist($user);
            //MEDIC SETTINGS
            $medsett = new MedicSettings();
            $medsett->setField($field);
            $medsett->setProfile($image);
            $medsett->setMedic($user);
            $em->persist($medsett);
            $output->write(array($i+1,'|',$fname,'|',$lname,'|',$field,'|',$email,'|',$image));
            $output->writeln('');
            if (($i % $batchSize) == 0) {
                $em->flush();
                //  $em->clear();
            }
        }
        $em->flush();
        $em->clear();


        $output->writeln('done');
    }

}

可能只是添加从浏览器而不是从cli运行批处理脚本,这是错误的。默认情况下,cli的时间限制设置为0,这意味着您从未获得超时。使您的sript成为控制台命令,并从CLI而不是从浏览器运行。对于这种批处理,CLI是最佳选择。但性能将与web版本相同。区别在于CLI默认情况下没有超时。@GeorgeIrimiciuc-我不是说它会更快,只是这是批处理脚本的正确方式。如果您认为它很慢,那么可能在db config中有一些时间(请求/秒)限制。可能只是添加从浏览器而不是从cli运行批处理脚本,这是错误的。默认情况下,cli将时间限制设置为0,这意味着您从未获得超时。使您的sript成为控制台命令,并从CLI而不是从浏览器运行。对于这种批处理,CLI是最佳选择。但性能将与web版本相同。区别在于CLI默认情况下没有超时。@GeorgeIrimiciuc-我不是说它会更快,只是这是批处理脚本的正确方式。如果您认为它很慢,那么在db配置中可能有一些时间(请求/秒)限制。