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
1 jawapan
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>
- 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);
- 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
Alat panas Tag
Hot Questions
Hot Tools
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 phpstudy pustaka masa jalan persekitaran pemasangan bersepadu
Kotak alat pengaturcara PHP versi penuh
Programmer Toolbox v1.0 PHP Persekitaran Bersepadu
VC11 32-bit
VC11 32-bit phpstudy pustaka masa jalan persekitaran pemasangan bersepadu
SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan
Topik panas





