cari
Rumahpembangunan bahagian belakangtutorial phpPHPyii2 队列 shmilyzxt/yii2-queue 简介

  • 在使用的过程中觉得挺好的,建议看一下关于队列的原理.

  • shmilyzxt/yii2-queue 简单解释:

  1. 我用的yii2高级版,我们从配置开始看代码,这里我用的是mysql队列,首先配置文件,我把queue配置项写在根目录common\config\main-local.php下的 components数组下,更改一下数据库配置.复制composer安装后复制
    vendor\shmilyzxt\yii2-queue\jobs\jobs.sql
    vendor\shmilyzxt\yii2-queue\failed\failed.sql
    2个sql文件到数据库中建立队列数据表和执行任务失败时的数据表.

  2. 推送任务开始语法:\Yii::$app->queue->pushOn(new SendMial(),['email'=>'49783121@qq.com','title'=>'test','content'=>'email test'],'email'); 我们到vendor\shmilyzxt\queue\queues\DatabaseQueue.php去看看代码,pushOn()方法写在了DatabaseQueue类的父类vendor\shmilyzxt\queue\base\Queue.php中:


//入队列public function pushOn($job, $data = '', $queue = null)
    {        //canPush 检查队列是否已达最大任务量
        if ($this->canPush()) {  
            //beforePush 入队列前的事件
            $this->trigger(self::EVENT_BEFORE_PUSH); 
            //入队列
            $ret = $this->push($job, $data, $queue);
            //afterPush 入队列后的事件
            $this->trigger(self::EVENT_AFTER_PUSH);
            return $ret;
        } else {            throw new \Exception("max jobs number exceed! the max jobs number is {$this->maxJob}");
        }
    }

注释:这里最好去看看yii2 event事件类.

关于入队列: $this->push($job, $data, $queue);,这里在配合queue类文件查看,相关函数跳转,处理一下数据记录到数据库中.(函数走向:getQueue()-->createPayload()-->pushToDatabase()),pushOn()最终返回数据插入数据库的结果,成功$ret是1.

3.后台运行命令处理队列,例:php ./yii worker/listen default 10 128 3 0 其中default是队列的名称,上面推送了一个email队列 应该改为email.
启动命令后,我们来看代码:首先执行:WorkerController控制器 actionListen方法,我们跟着代码进入到 vendor\shmilyzxt\queue\Worker.php -- listen方法中,这里其实就是一直在循环,执行操作队列的任务:


/**  
 * 启用一个队列后台监听任务  
 * @param Queue $queue  
 * @param string $queueName 监听队列的名称(在pushon的时候把任务推送到哪个队列,则需要监听相应的队列才能获取任务)  
 * @param int $attempt 队列任务失败尝试次数,0为不限制  * @param int $memory 允许使用的最大内存  
 * @param int $sleep 每次检测的时间间隔  
 */
    public static function listen(Queue $queue, $queueName = 'default', $attempt = 10, $memory = 512, $sleep = 3, $delay = 0){        
        while (true){            
            try{               
                //DatabaseQueue从数据库队列取出一个可用任务(实例),并且更新任务
                $job = $queue->pop($queueName);
             }catch (\Exception $e){                
                throw $e;
                continue;
             }            
             if($job instanceof Job){                
                 //判断执行错误的次数是否大于传入的执行次数
                 if($attempt > 0 && $job->getAttempts() > $attempt){                    
                     $job->failed();
                 }else{                    
                     try{                        
                         //throw new \Exception("test failed");
                         $job->execute();
                      }catch (\Exception $e){                        
                          //执行失败,判断是否被删除,重新入队
                          if (! $job->isDeleted()) {                           
                              $job->release($delay);
                          }
                      }
                  }
               }else{                
                   self::sleep($sleep);
                }             
                if (self::memoryExceeded($memory)) {               
                    self::stop();
                }
               }
    }

注释:在$queue->pop($queueName);vendor\shmilyzxt\queue\queues\DatabaseQueue.php方法内使用事务执行SQL,并且创建vendor\shmilyzxt\queue\jobs\DatabaseJob.php的实例


    //取出一个任务
    public function pop($queue = null)
    {        $queue = $this->getQueue($queue);

        if (!is_null($this->expire)) {            //$this->releaseJobsThatHaveBeenReservedTooLong($queue);
        }        $tran = $this->connector->beginTransaction();
        //判断是否有一个可用的任务需要执行
        if ($job = $this->getNextAvailableJob($queue)) {            $this->markJobAsReserved($job->id);
            $tran->commit();

            $config = array_merge($this->jobEvent, [
                'class' => 'shmilyzxt\queue\jobs\DatabaseJob',
                'queue' => $queue,
                'job' => $job,
                'queueInstance' => $this,
            ]);

            return \Yii::createObject($config);

        }        $tran->commit();
        return false;
    }

至于:$job->execute();DatabaseJob继承父类Job执行的,顺着代码找下去是yii\base\Component trigger执行的事件,


/** 
 * 执行任务 
 */
public function execute(){   
  //beforeExecute 执行任务之前的一个事件 在JobEvent中并没有什么可执行的代码
  $this->trigger(self::EVENT_BEFORE_EXECUTE, new JobEvent(["job" => $this, 'payload' => $this->getPayload()]));
  $this->resolveAndFire();//真正执行的任务的方法
}


 /**   * 真正任务执行方法(调用hander的handle方法)   * @param  array $payload   * @return void */
    protected function resolveAndFire()
    {        $payload = $this->getPayload();
        $payload = unserialize($payload); //反序列化数据
        $type = $payload['type'];
        $class = $payload['job'];

        if ($type == 'closure' && ($closure = (new Serializer())->unserialize($class[1])) instanceof \Closure) {            
            $this->handler = $this->getHander($class[0]);
            $this->handler->closure = $closure;
            $this->handler->handle($this, $payload['data']);
        } else if ($type == 'classMethod') {            $payload['job'][0]->$payload['job'][1]($this, $payload['data']);
        } else if ($type == 'staticMethod') {            $payload['job'][0]::$payload['job'][1]($this, $payload['data']);
        } else {//执行的`SendMail`类的`handle($job,$data)`方法
            $this->handler = $this->getHander($class);
            $this->handler->handle($this, $payload['data']);
        }        //执行完任务后删除
        if (!$this->isDeletedOrReleased()) {            $this->delete();
        }
    }

最后到了执行的SendMail类的handle($job,$data),在这里就是推送到队列的对象和数据,接着就是我们的处理逻辑了.


public function handle($job,$data)
    {        if($job->getAttempts() > 3){            $this->failed($job);
        }        $payload = $job->getPayload();
        echo &#39;<pre class="brush:php;toolbar:false">&#39;;print_r($payload);
        //$payload即任务的数据,你拿到任务数据后就可以执行发邮件了
        //TODO 发邮件
    }

Atas ialah kandungan terperinci PHPyii2 队列 shmilyzxt/yii2-queue 简介. 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
Bagaimanakah jenis membayangkan jenis PHP, termasuk jenis skalar, jenis pulangan, jenis kesatuan, dan jenis yang boleh dibatalkan?Bagaimanakah jenis membayangkan jenis PHP, termasuk jenis skalar, jenis pulangan, jenis kesatuan, dan jenis yang boleh dibatalkan?Apr 17, 2025 am 12:25 AM

Jenis PHP meminta untuk meningkatkan kualiti kod dan kebolehbacaan. 1) Petua Jenis Skalar: Oleh kerana Php7.0, jenis data asas dibenarkan untuk ditentukan dalam parameter fungsi, seperti INT, Float, dan lain -lain. 2) Return Type Prompt: Pastikan konsistensi jenis nilai pulangan fungsi. 3) Jenis Kesatuan Prompt: Oleh kerana Php8.0, pelbagai jenis dibenarkan untuk ditentukan dalam parameter fungsi atau nilai pulangan. 4) Prompt jenis yang boleh dibatalkan: membolehkan untuk memasukkan nilai null dan mengendalikan fungsi yang boleh mengembalikan nilai null.

Bagaimanakah PHP mengendalikan pengklonan objek (kata kunci klon) dan kaedah sihir __clone?Bagaimanakah PHP mengendalikan pengklonan objek (kata kunci klon) dan kaedah sihir __clone?Apr 17, 2025 am 12:24 AM

Dalam PHP, gunakan kata kunci klon untuk membuat salinan objek dan menyesuaikan tingkah laku pengklonan melalui kaedah Magic \ _ _ _. 1. Gunakan kata kunci klon untuk membuat salinan cetek, mengkloning sifat objek tetapi bukan sifat objek. 2. Kaedah klon \ _ \ _ boleh menyalin objek bersarang untuk mengelakkan masalah menyalin cetek. 3. Beri perhatian untuk mengelakkan rujukan pekeliling dan masalah prestasi dalam pengklonan, dan mengoptimumkan operasi pengklonan untuk meningkatkan kecekapan.

PHP vs Python: Gunakan Kes dan AplikasiPHP vs Python: Gunakan Kes dan AplikasiApr 17, 2025 am 12:23 AM

PHP sesuai untuk pembangunan web dan sistem pengurusan kandungan, dan Python sesuai untuk sains data, pembelajaran mesin dan skrip automasi. 1.PHP berfungsi dengan baik dalam membina laman web dan aplikasi yang cepat dan berskala dan biasanya digunakan dalam CMS seperti WordPress. 2. Python telah melakukan yang luar biasa dalam bidang sains data dan pembelajaran mesin, dengan perpustakaan yang kaya seperti numpy dan tensorflow.

Huraikan tajuk caching HTTP yang berbeza (mis., Cache-Control, ETAG, Modified Last).Huraikan tajuk caching HTTP yang berbeza (mis., Cache-Control, ETAG, Modified Last).Apr 17, 2025 am 12:22 AM

Pemain utama dalam tajuk cache HTTP termasuk kawalan cache, ETAG, dan modifikasi terakhir. 1.Cache-Control digunakan untuk mengawal dasar caching. Contoh: Cache-Control: Max-Age = 3600, Awam. 2. ETAG mengesahkan perubahan sumber melalui pengenal unik, Contoh: ETAG: "686897696A7C876B7E". 3. Modified Last Menunjukkan Masa Pengubahsuaian Terakhir Sumber, Contoh: Modified Last: Wed, 21OCT201507: 28: 00GMT.

Terangkan hashing kata laluan yang selamat di PHP (mis., Password_hash, password_verify). Mengapa tidak menggunakan MD5 atau SHA1?Terangkan hashing kata laluan yang selamat di PHP (mis., Password_hash, password_verify). Mengapa tidak menggunakan MD5 atau SHA1?Apr 17, 2025 am 12:06 AM

Dalam php, kata laluan_hash dan kata laluan 1) password_hash menjana hash yang mengandungi nilai garam untuk meningkatkan keselamatan. 2) Kata Laluan_verify Sahkan kata laluan dan pastikan keselamatan dengan membandingkan nilai hash. 3) MD5 dan SHA1 terdedah dan kekurangan nilai garam, dan tidak sesuai untuk keselamatan kata laluan moden.

PHP: Pengenalan kepada bahasa skrip sisi pelayanPHP: Pengenalan kepada bahasa skrip sisi pelayanApr 16, 2025 am 12:18 AM

PHP adalah bahasa skrip sisi pelayan yang digunakan untuk pembangunan web dinamik dan aplikasi sisi pelayan. 1.Php adalah bahasa yang ditafsirkan yang tidak memerlukan kompilasi dan sesuai untuk perkembangan pesat. 2. Kod PHP tertanam dalam HTML, menjadikannya mudah untuk membangunkan laman web. 3. PHP memproses logik sisi pelayan, menghasilkan output HTML, dan menyokong interaksi pengguna dan pemprosesan data. 4. PHP boleh berinteraksi dengan pangkalan data, penyerahan borang proses, dan melaksanakan tugas-tugas sampingan pelayan.

PHP dan Web: Meneroka kesan jangka panjangnyaPHP dan Web: Meneroka kesan jangka panjangnyaApr 16, 2025 am 12:17 AM

PHP telah membentuk rangkaian sejak beberapa dekad yang lalu dan akan terus memainkan peranan penting dalam pembangunan web. 1) PHP berasal pada tahun 1994 dan telah menjadi pilihan pertama bagi pemaju kerana kemudahan penggunaannya dan integrasi lancar dengan MySQL. 2) Fungsi terasnya termasuk menghasilkan kandungan dinamik dan mengintegrasikan dengan pangkalan data, yang membolehkan laman web dikemas kini secara real time dan dipaparkan secara peribadi. 3) Aplikasi dan ekosistem PHP yang luas telah mendorong kesan jangka panjangnya, tetapi ia juga menghadapi kemas kini versi dan cabaran keselamatan. 4) Penambahbaikan prestasi dalam beberapa tahun kebelakangan ini, seperti pembebasan Php7, membolehkannya bersaing dengan bahasa moden. 5) Pada masa akan datang, PHP perlu menangani cabaran baru seperti kontena dan microservices, tetapi fleksibiliti dan komuniti aktif menjadikannya boleh disesuaikan.

Mengapa menggunakan PHP? Kelebihan dan faedah dijelaskanMengapa menggunakan PHP? Kelebihan dan faedah dijelaskanApr 16, 2025 am 12:16 AM

Manfaat utama PHP termasuk kemudahan pembelajaran, sokongan pembangunan web yang kukuh, perpustakaan dan kerangka yang kaya, prestasi tinggi dan skalabilitas, keserasian silang platform, dan keberkesanan kos. 1) mudah dipelajari dan digunakan, sesuai untuk pemula; 2) integrasi yang baik dengan pelayan web dan menyokong pelbagai pangkalan data; 3) mempunyai rangka kerja yang kuat seperti Laravel; 4) Prestasi tinggi dapat dicapai melalui pengoptimuman; 5) menyokong pelbagai sistem operasi; 6) Sumber terbuka untuk mengurangkan kos pembangunan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa