我有文件上传监听器,它上传文件,解析它并通过Doctrine将数据放入数据库。脚本如下:
<?php
namespace AppBundle\EventListener;
use CommonBundle\Entity\Classifiers;
use Doctrine\Common\Persistence\ObjectManager;
use Oneup\UploaderBundle\Event\PostPersistEvent;
use CommonBundle\Entity\ClassifierPhrase;
use CommonBundle\Entity\ClassifierSubject;
class UploadListener
{
/**
* @var ObjectManager
*/
private $om;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function onUpload(PostPersistEvent $event)
{
$type = $event->getRequest()->get('type');
if($event->getRequest()->get('classifier_id')){
$classifier_id = $event->getRequest()->get('classifier_id');
$classifier = $this->om->getRepository('CommonBundle:Classifiers')->findOneBy(['id' => $classifier_id]);
}
$file = $event->getFile();
$contents = file_get_contents($file->getPathname());
$entries = preg_split("/\\r\\n|\\r|\\n/", $contents);
foreach($entries as $entry) {
$time_start = microtime(true); //start here
//some parsing logic
$this->om->persist($phrase);
$this->om->flush();
$time_end = microtime(true);
$execution_time = round(($time_end - $time_start)/60, 4);
file_put_contents('C:\xampp\htdocs\perfomance.txt', 'time: ' . $execution_time. ' phrase: '.$entry[0].PHP_EOL, FILE_APPEND);
//takes about 0.005 sec per entry
}
$response = [$event->getResponse(), 'success' => true];
return $response;
}
}
因此,在加价时,大约需要0.005秒才能完成工作。我在我的文件和php max_execution指令中有5000个条目300秒,它不能处理所有条目5分钟。同样在脚本执行期间,我看到如何将条目添加到我的日志文件中,并且我看到它正在通过条目添加条目,但速度很慢(每秒大约20个条目)。所以它在我的foreach
循环中解析条目期间等待某些事情。任何想法如何描述脚本及其为何如此持久的想法都会受到欢迎。谢谢。
答案 0 :(得分:0)
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html
ORM工具主要不适合大规模插入,更新或删除。每个RDBMS都有自己的,最有效的方式来处理此类操作,如果下面列出的选项不足以满足您的需要,我们建议您使用适用于这些批量操作的特定RDBMS工具。
这意味着您不应将Doctrine ORM用于批量插入。就那么简单。 请改用Doctrine DBAL和SQL。