Rumah  >  Soal Jawab  >  teks badan

Cipta pemprosesan selari PHP daripada permintaan prinsip getResult

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粉649990163P粉649990163422 hari yang lalu542

membalas semua(1)saya akan balas

  • P粉211273535

    P粉2112735352023-09-15 10:29:17

    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:

    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

    balas
    0
  • Batalbalas