Rumah  >  Artikel  >  rangka kerja php  >  Pengalaman praktikal swole: menggunakan coroutine untuk pemprosesan e-mel serentak tinggi

Pengalaman praktikal swole: menggunakan coroutine untuk pemprosesan e-mel serentak tinggi

WBOY
WBOYasal
2023-06-14 14:01:401053semak imbas

Dengan perkembangan pesat teknologi Internet dan pengembangan berterusan senario aplikasi, perkhidmatan e-mel telah menjadi bahagian yang amat diperlukan dalam kerja harian perusahaan/individu. Walau bagaimanapun, dalam penghantaran e-mel berskala besar, konkurensi tinggi sering menjadi halangan, seperti sambungan yang kerap atau penyambungan semula ke pelayan SMTP, penggunaan baris gilir mesej dan operasi lain ini memerlukan banyak masa dan sumber sistem, yang menjejaskan keseluruhan penghantaran e-mel kecekapan proses. Jadi, bagaimana untuk mencapai pemprosesan e-mel yang cekap dengan sumber yang minimum?

Amalan telah menunjukkan bahawa menggunakan coroutine dalam Swoole untuk pemprosesan e-mel serentak tinggi adalah kaedah yang sangat boleh dilaksanakan dan cekap. Artikel ini akan memperkenalkan beberapa amalan pembangunan tentang cara menggunakan ciri coroutine Swoole untuk mencapai pemprosesan e-mel serentak yang tinggi.

1. Pengenalan kepada coroutine

Coroutine ialah benang ringan, yang boleh dilihat sebagai kompromi antara proses dan urutan. Coroutine mempunyai ciri-ciri berikut:

  1. Penukaran konteks kos rendah
  2. Tiada mekanisme kunci diperlukan
  3. Pendudukan sumber yang ringan
  4. Kolaborasi Pelbagai Tugas

Dalam ciri coroutine Swoole, operasi coroutine boleh dilakukan melalui fungsi berikut:

  1. SwooleCoroutineun(boleh dipanggil $fn): Mulakan coroutine Swoole.
  2. SwooleCoroutinecreate(boleh dipanggil $fn, bool $coroutine_params): Buat coroutine.
  3. SwooleCoroutine::yield(): Menjeda pelaksanaan coroutine semasa dan tidak melepaskan sumber CPU.
  4. SwooleCoroutine::resume($coroutine_id): Sambung semula coroutine yang ditentukan.

2 Amalan: Gunakan ciri coroutine Swoole untuk mencapai pemprosesan e-mel serentak yang tinggi

  1. Mulakan klien SMTP

Gunakan coroutine Swoole Ia adalah agak mudah untuk mengendalikan penghantaran e-mel menggunakan ciri pengaturcaraan. Kami boleh menghantar e-mel berdasarkan perpustakaan PHPMailer.

Mula-mula anda perlu memulakan klien SMTP dan menetapkan parameter yang berkaitan dengan pelayan SMTP:

try {
   $mail = new PHPMailer;
   $mail->isSMTP();
   $mail->SMTPDebug  = 0;
   $mail->SMTPAuth  = true;
   $mail->SMTPSecure = 'tls';
   $mail->Host   = "smtp.example.com";
   $mail->Port   = "465";
   $mail->CharSet = "utf-8";
   $mail->Username = "user@example.com";
   $mail->Password = "password";
   $mail->setFrom('user@example.com', 'Mailer');
   $mail->addAddress('recipient@example.com', 'Recipient');
   $mail->isHTML(true);
   $mail->Subject = 'Test email';
   $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
   $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
}
catch (Exception $e) {
   echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
   exit;
}
  1. Gunakan coroutine untuk menghantar e-mel konkurensi tinggi

Seterusnya, kami akan menggunakan ciri coroutine Swoole untuk menghantar berbilang e-mel serentak:

$tasks = array();
for ($i = 0; $i < $concurrency; $i++) {
   $tasks[] = SwooleCoroutine::create(function () use ($mail) {
       $result = $mail->send();
       if (!$result) {
           echo "Mailer Error: {$mail->ErrorInfo}
";
       } else {
           echo "Message sent successfully!
";
       }
   });
}
SwooleCoroutine::wait($tasks);

Dalam contoh ini, kami menggunakan fungsi SwooleCoroutine::create() untuk mencipta berbilang coroutine. Coroutine ini akan menghantar berbilang e-mel serentak. Akhir sekali, kami menggunakan fungsi SwooleCoroutine::wait() untuk menunggu semua coroutine menyelesaikan pelaksanaan.

  1. Melaksanakan penyelenggaraan status pelayan SMTP

Apabila pelayan SMTP menerima sejumlah besar permintaan sambungan, ia mungkin menolak kebanyakan permintaan dalam tempoh masa yang singkat kali ini kita perlu Penyelenggaraan status pelayan SMTP selesai semasa pemprosesan coroutine. Sebagai contoh, apabila pelayan SMTP menolak permintaan, kami perlu menangguhkan untuk tempoh masa sebelum cuba menghantar e-mel semula. Pada masa ini kita perlu menggunakan fungsi SwooleCoroutinesleep() untuk mencapai ini.

Sebagai contoh, kami boleh menggunakan kod berikut untuk mengekalkan status pelayan SMTP:

$max_retry_count = 5;
for ($i = 0; $i < $concurrency; $i++) {
   $tasks[] = SwooleCoroutine::create(function () use ($mail, $max_retry_count) {
       $retry_count = 0;
       $result = false;
       while (!$result && $retry_count++ < $max_retry_count) {
           $result = $mail->send();
           if (!$result) {
               echo "Mailer Error: {$mail->ErrorInfo}
";
               if ($retry_count < $max_retry_count) {
                   $sleep_time = 2 ** ($retry_count - 1);
                   echo "sleep $sleep_time seconds before retrying...
";
                   SwooleCoroutine::sleep($sleep_time);
               }
           } else {
               echo "Message sent successfully!
";
           }
       }
   });
}

Dalam kod contoh ini, kami akan cuba menghantar semula e-mel dan tidur untuk satu tempoh masa setiap kali ia gagal. Setiap masa tidur akan meningkat apabila bilangan kegagalan meningkat.

Ringkasan

Ciri coroutine Swoole menyediakan cara yang lebih mudah, pantas dan cekap untuk pemprosesan e-mel konkurensi tinggi. Dalam amalan, ia hanya memerlukan beberapa baris kod untuk mencapai pemprosesan e-mel serentak yang tinggi dengan menggunakan ciri coroutine Swoole. Jika anda ingin membangunkan aplikasi konkurensi tinggi yang lain, anda juga boleh mempertimbangkan untuk menggunakan ciri coroutine Swoole dan cuba menyepadukannya ke dalam projek anda untuk meningkatkan prestasi aplikasi.

Atas ialah kandungan terperinci Pengalaman praktikal swole: menggunakan coroutine untuk pemprosesan e-mel serentak tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn