cari
Soal Jawab Cipta pemprosesan selari PHP daripada permintaan prinsip getResult
Cipta pemprosesan selari PHP daripada permintaan prinsip getResult
P粉649990163 2023-09-14 19:30:46 pandangan 979
PHP

0

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

Your Answer
serahkan

1 jawapan
0

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

2023-09-15 10:29:17

serahkan

Hot Tools

vc9-vc14 (32+64 bit) koleksi perpustakaan masa jalan (pautan di bawah)

vc9-vc14 (32+64 bit) koleksi perpustakaan masa jalan (pautan di bawah)

Muat turun koleksi perpustakaan runtime yang diperlukan untuk pemasangan phpStudy

VC9 32-bit

VC9 32-bit

VC9 32-bit phpstudy pustaka masa jalan persekitaran pemasangan bersepadu

Kotak alat pengaturcara PHP versi penuh

Kotak alat pengaturcara PHP versi penuh

Programmer Toolbox v1.0 PHP Persekitaran Bersepadu

VC11 32-bit

VC11 32-bit

VC11 32-bit phpstudy pustaka masa jalan persekitaran pemasangan bersepadu

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan