Cipta pemprosesan selari PHP daripada permintaan prinsip getResult
P粉649990163
P粉649990163 2023-09-14 19:30:46
0
1
582

Saya mahu melakukan beberapa jenis multithreading dalam persekitaran PHP8/Symfony6 dan ia berfungsi seperti ini:

Saya membuat permintaan prinsip yang melayani kira-kira sejuta baris

Saya ingin mencipta berbilang proses selari untuk memproses baris pada masa yang sama. Permintaan saya dibuat melalui getResult() yang menyediakan objek doktrin. Adakah terdapat cara untuk mencipta benang dengan tatasusunan objek sebagai parameter. Kemudian buat utas apabila "baris gilir" saya diisi dengan data?

Saya menjumpai beberapa maklumat tentang "pthreads" atau "popen" tetapi saya tidak pasti sama ada ia masih relevan kerana topik itu agak lama

P粉649990163
P粉649990163

membalas semua(1)
P粉211273535

Dalam kes ini, salah satu perkara yang Doktrin lakukan ialah menghidratkan kelas dengan kandungan data, jadi semua berjuta-juta rekod ditukar kepada kelas dan menyimpannya dalam ingatan, jadi beberapa cadangan: p>

  1. Elakkan menggunakan getResult dalam pertanyaan yang besar. Sebaliknya, jika anda ingin melakukan sesuatu dengan objek ini, cuba buka penomboran dan kosongkan pengurus entiti, seperti:
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);
  1. Gunakan sambil untuk bertanya secara terus:
<?php

$sql = <<<SQL
SELECT
    *
FROM user u
SQL;

$statement = $connection->prepare($sql);

$statement->execute();

while ($user = $statement->fetch()) {
    // print_r($user);
}

Anda juga boleh menggunakan gelung fetchAll 方法一次获取所有用户,但请注意,如果您的查询返回太多用户,则可能会耗尽内存。使用上面的 while, anda hanya mengambil satu pengguna ke dalam memori pada satu masa, jadi prestasi memori adalah lebih baik.

<?php

// ...

// all users are in memory here
$users = $connection->fetchAll($sql);

foreach ($users as $user) {
    // print_r($user);
}

Seperti seseorang mengulas, anda boleh menggunakan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan