Rumah >rangka kerja php >ThinkPHP >Artikel ini mengajar anda cara melaksanakan baris gilir mesej redis menggunakan ThinkPHP menggunakan think-queue.
Artikel ini membawakan anda pengetahuan yang berkaitan tentang thinkphp, yang terutamanya mengatur isu berkaitan penggunaan think-queue untuk melaksanakan baris gilir mesej redis Mari kita lihat bersama-sama semua orang.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Dalam tengah baris gilir mesej Perisian adalah komponen penting dalam sistem berskala besar dan secara beransur-ansur menjadi cara teras komunikasi dalaman dalam sistem perusahaan. Ia mempunyai beberapa siri fungsi seperti gandingan longgar, pemesejan tak segerak, pencukuran puncak trafik, penghantaran yang boleh dipercayai, penyiaran, kawalan aliran, dan konsistensi akhirnya, dan telah menjadi salah satu cara utama RPC tak segerak.
Baris gilir mesej mempunyai dua peranan dan satu bekas Peranan adalah pengeluar (bertanggungjawab untuk tugasan penerbitan) dan pengguna (bertanggungjawab untuk melaksanakan tugasan). Tumpukan tugas yang dikeluarkan oleh pengeluar, memisahkan dua langkah pelepasan dan pelaksanaan tanpa menjejaskan satu sama lain.
Pengeluar menerbitkan tugasan dan menyimpan/mengumpulnya dalam baris gilir mesej Pengguna mengambil inisiatif untuk mengeluarkan tugas daripada baris gilir mesej dan melaksanakannya. Yang diterbitkan dahulu dilaksanakan terlebih dahulu ( Baris gilir: masuk dahulu keluar dahulu), apabila tiada pengguna, tugas akan terkumpul dalam baris gilir menunggu untuk dikeluarkan untuk pelaksanaan.
Baris gilir mesej sesuai untuk antara muka pihak ketiga dengan masa bersamaan yang besar atau masa pemprosesan yang lama dan memerlukan operasi kelompok Ia boleh digunakan untuk tetapi tidak terhad kepada penghantaran SMS, penghantaran e-mel, APP push, dsb., dan menyokong silang- Sistem, iaitu, baris gilir mesej yang diterbitkan oleh sistem ini boleh melaksanakan tugas dengan sendirinya atau untuk sistem lain Dengan cara yang sama, sistem ini juga boleh bertindak sebagai pengguna untuk melaksanakan baris gilir mesej tugas yang diterbitkan dengan sendirinya atau sistem lain.
ThinkPHP's Queue mempunyai empat pemacu terbina dalam: Redis, Pangkalan Data, Topthink dan Sync digunakan di sini dan juga disyorkan. Redis
mesej gilir fikir boleh melaksanakan tugas seperti menerbitkan, mendapatkan, melaksanakan, memadam, menerbitkan semula, penerbitan tertunda, kawalan tamat masa dan operasi lain
Cipta fail konfigurasi queue.php dalam direktori tambahan
<?phpreturn [ 'connector' => 'Redis', 'expire' => null, // 任务过期时间,默认为60秒,若要禁用,则设置为 null 'default' => 'REDIS_QUEUE', // 默认的队列名 'host' => '127.0.0.1', // redis 主机ip 'port' => 6379, // redis 端口 'password' => '', // redis 密码 'select' => 0, // 使用哪里一个 db,默认为 db0 'timeout' => 0, // redis 连接的超时时间 'persistent' => false, // 是否是长连接];
Mengapa ia diletakkan di sini, ia adalah kerana kod sumber Queue membaca fail giliran daripada tambahan untuk mendapatkan maklumat konfigurasi secara lalai. Jika anda ingin meletakkan fail konfigurasi di tempat lain , anda perlu mengubah suai konfigurasi pemerolehan lalai dalam kod sumber dengan sewajarnya, seperti yang ditunjukkan dalam rajah di bawah
Buat kelas ujian dan tulis kepada pengeluar Kaedah
<?phpnamespace app\api\controller;use think\Controller;use think\Queue;class Test extends Controller{ // 生产者,添加消息队列 public function addQueue() { // 参数 $data = [ 'id' => rand(0, 99), 'userName' => '一起摸鱼' ]; // 消息队列名 $queueName = 'testQueue'; // 推入消息队列,注意这里的 ::class 是PHP5.5才有的写法 $isPushed = Queue::push(TestQueue::class, $data, $queueName); // PHP5.5以下的可以直接写命名空间 // $isPushed = Queue::push('app\common\queue\TestQueue', $data, $queueName); if ($isPushed !== false) { // 成功之后的业务 echo '队列加入成功'; } else { // 失败之后的业务 echo '队列加入失败'; } }}
Buat kelas TestQueue untuk digunakan sebagai pengguna untuk melaksanakan tugas dalam baris gilir mesej
<?phpnamespace app\common\queue;use think\Log;use think\queue\Job;class TestQueue{ // 消费者执行入口 public function fire(Job $job, $data) { // 具体执行业务 $isJobDone = $this->doJob($data); if ($isJobDone) { // 消息队列执行成功,删除队列,否则会一直执行 $job->delete(); } else { // 消息队列执行失败 // 获取消息队列已经重试了几遍 $attempts = $job->attempts(); if ($attempts == 0 || $attempts == 1) { // 重新发布,参数 delay 是延时发布的时间 $job->release(2); } } } // 消息队列执行失败后会自动执行该方法 public function failed($data) { Log::error('消息队列达到最大重复执行次数后失败:' . json_encode($data)); } // 消息队列执行方法 public function doJob($data) { // 具体执行业务 $data = json_encode($data); echo '消息队列:' . $data; // 这里的判断条件以具体业务是否执行成功进行判断 if ($data) { echo "执行成功"; return true; } else { echo "执行失败"; return false; } }}
Minta antara muka, pengeluar menerbitkan tugas
menyimpan baris gilir redis
Langkah seterusnya ialah mendayakan mod Mendengar baris gilir, kerana adalah mustahil untuk melaksanakan baris gilir secara manual setiap kali tugasan ditambahkan. Terdapat dua mod mendengar untuk baris gilir Parameter konfigurasi adalah seperti berikut:
Laksanakan dalam direktori akar projek
php think queue:work --nama baris gilir
Buka pengguna dan laksanakan tugas
Tugas dalam baris gilir redis juga dipadamkan selepas pelaksanaan
Tetapi atas keperluan, kami juga perlu menangguhkan pelaksanaan proses daemon pengguna untuk memastikan baris gilir masih boleh dimulakan selepas menutup terminal.
nohup php think queue:listen --queue queue name&
PS: input dalam shell exit untuk keluar dari terminal
PS: Masukkan exit dalam shell untuk keluar dari terminal
PS: Enter exit in shell Keluar dari terminal
Kerana apabila nohup berjaya dilaksanakan dan anda mengklik butang tutup program untuk menutup terminal, sesi yang sepadan dengan arahan akan diputuskan sambungan, menyebabkan proses yang sepadan dengan nohup untuk dimaklumkan bahawa ia perlu ditutup bersama.
Pada ketika ini, keseluruhan proses baris gilir mesej telah tamat.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Artikel ini mengajar anda cara melaksanakan baris gilir mesej redis menggunakan ThinkPHP menggunakan think-queue.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!