O código abaixo funciona bem sendo carregado um a um:
$capture = new Capture();
$capture->setDatetime($datetime);
$keyword = new Keyword();
$keyword->setKeyword($body->breadCrumb->keywords);
$find = $entityManager->getRepository('TesteBot\Teste\JsonToDb\Entity\Keyword')
->findOneBy(['keyword' => $keyword->getKeyword()]);
if ($find) $keyword = $find;
$capture->setKeyword($keyword);
$entityManager = reopenEntityManagerIfClosed($entityManager);
$entityManager->persist($capture);
$entityManager->flush($capture);
Porém para acelerar o processo sem usar pthreads, usei o popen:
for ($i=0; $i<10; $i++) {
// open ten processes
for ($j=0; $j<10; $j++) {
$pipe[$j] = popen('script2.php', 'w');
}
// wait for them to finish
for ($j=0; $j<10; ++$j) {
pclose($pipe[$j]);
}
}
E começou a retornar o seguinte erro:
2020-12-08 00:33:13 - 2020-12-02 09:04:06.json - PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Papelaria Adesivo' for key 'Keyword.UNIQ_952E48A75A93713B' in /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:115
Stack trace:
#0 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php(115): PDOStatement->execute()
#1 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php(167): Doctrine\DBAL\Driver\PDOStatement->execute()
#2 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php(286): Doctrine\DBAL\Statement->execute()
#3 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(1097): Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
#4 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(402): Doctrine\ORM\UnitOfWork->executeInserts()
#5 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php(371): Doctrine\ORM\UnitOfWork->commit()
#6 /home/edison/Documentos/bots/teste-bot/teste-json-to-db/command/json-to-db-popen-2.php(97): Doctrine\ORM\EntityManager->flush()
#7 {main}
Eu gostaria de saber se existe alguma forma de subir os arquivos de forma concorrente? Não tem insert/update igual o eloquent? se duas pessoas acessarem ao mesmo tempo o sistema e fizerem uma inserção na mesma chave unica com mesmo valor entao o sistema falha?