Je souhaite faire une sorte de multithreading dans un environnement PHP8/Symfony6 et cela fonctionne comme ceci :
Je fais une demande principale qui dessert environ un million de lignes
Je souhaite créer plusieurs processus parallèles pour traiter les lignes en même temps. Ma requête se fait via getResult() qui sert l'objet doctrine. Existe-t-il un moyen de créer un thread avec un tableau d'objets comme paramètre. Puis créer des fils de discussion chaque fois que ma ? file d'attente ? est remplie de données ?
J'ai trouvé quelques informations sur "pthreads" ou "popen" mais je ne sais pas si c'est toujours d'actualité car le sujet date un peu
Dans ce cas, l'une des choses que Doctrine fait est d'hydrater une classe avec le contenu des données, de sorte que les millions d'enregistrements soient convertis en classes et les conservent en mémoire, donc quelques suggestions?: p>
public function paginate(int $start = 0, int $offset = 10): Doctrine\ORM\Tools\Pagination\Paginator { $qb = $this->createQueryBuilder('student'); $qb ->where($qb->expr()->isNull('student.schoolRef')) ->setFirstResult($start) ->setMaxResults($offset); return new Paginator($qb, true); } src/Service.php $start = 0; $offset = 100; do { $i = 0; $students = $this->studentRepository->paginate($start, $offset); foreach($students as $student) { //do stuff ++$i; } $this->entityManager->flush(); $this->entityManager->clear(); } while ($i == $offset);
<?php $sql = <<<SQL SELECT * FROM user u SQL; $statement = $connection->prepare($sql); $statement->execute(); while ($user = $statement->fetch()) { // print_r($user); }
Vous pouvez également utiliser une boucle fetchAll
方法一次獲取所有用戶,但請注意,如果您的查詢返回太多用戶,則可能會耗盡內存。使用上面的 while
, vous ne récupérez qu'un seul utilisateur en mémoire à la fois, les performances de la mémoire sont donc meilleures.
<?php // ... // all users are in memory here $users = $connection->fetchAll($sql); foreach ($users as $user) { // print_r($user); }
Comme quelqu'un l'a commenté, vous pouvez utiliser