Rumah > Soal Jawab > teks badan
Gunakan penyelia untuk memantau kerja dalam baris gilir,
php artisan queue:listen --timeout=0
Gunakan
php artisan queue:failed-table
Rekod giliran yang gagal telah diwujudkan, tetapi keadaan semasa ialah yang gagal sentiasa dilaksanakan berulang kali dan tidak ditulis kepada failed_job
Dalam dokumentasi laravel
php artisan queue:listen connection-name --tries=3
Apakah yang dimaksudkan dengan nama sambungan?
php artisan queue:listen --timeout=0 --try=3, queue execution error
exception 'Swift_TransportException' with message 'Expected response code 250 but got code "", with message ""'
Bagaimana untuk menyelesaikan masalah ini?
高洛峰2017-05-16 16:58:46
Anda boleh memilih daripada pelbagai perkhidmatan giliran dalam laravel, yang biasa adalah redis dan beanstalk Memandangkan redis adalah db yang mudah, datanya benar-benar telus, jadi lebih mudah difahami jika redis digunakan sebagai objek penjelasan di sini. .
Kaedah permulaan baris gilir dalam laravel termasuk queue:listen
dan queue:work
, dengan queue:work
bermaksud menjalankan tugas seterusnya secara berasingan perbezaan Sila lihat: perbezaan antara queue:listen dan queue:work --daemon. queue:listen
juga dilaksanakan secara dalaman dengan memanggil queue:work
lagi dan lagi Sekarang mari kita lihat perintah work
. queue:listen
和queue:work
, 其中queue:work
表示单独运行下一个job. 关于区别请看:queue:listen 和 queue:work --daemon 的区别 。queue:listen
内部也是一次次的调用queue:work
实现的,现在我们来看work
命令。
在IlluminateQueueConsoleWorkCommand
中是不是看见了我们熟悉的fire
方法?对就是它。继续追,
调用runWork
方式查找job并且执行.这里有一个daemon
选项, 表示是否作为守护运行。直接将daemon认为false(因为daemon其实就是一个while(true) ):joy:。
看到runWork
其实是调用的IlluminateQueueWorker::pop
方法
public function pop($connectionName, $queue = null, $delay = 0, $sleep = 3, $maxTries = 0)
{
$connection = $this->manager->connection($connectionName); //这里就是你说的连接名称,实际就是选择一个合理的queue服务,只要你没有用某个队列服务的特有的方法,那么各个队列可以随时切换使用的.
$job = $this->getNextJob($connection, $queue); //查找一个job对象
// If we're able to pull a job off of the stack, we will process it and
// then immediately return back out. If there is no job on the queue
// we will "sleep" the worker for the specified number of seconds.
if ( ! is_null($job))
{
//如果job存在则执行任务
return $this->process(
$this->manager->getName($connectionName), $job, $maxTries, $delay
);
}
$this->sleep($sleep);
return ['job' => null, 'failed' => false];
}
到了最终执行job的位置(删掉了空行和注释,因为我要来上蹩脚的中文注释了.(逃 ):
public function process($connection, Job $job, $maxTries = 0, $delay = 0)
{
if ($maxTries > 0 && $job->attempts() > $maxTries){ //看见了吗,运行的时候先查看了job的执行次数如果超过了最大次数,则直接进入logFailedJob过程,也就是将失败的job存储到指定的数据库中, 观察`Illuminate\Queue\Jobs\RedisJob`中的`attempts `方法和`release`方法。一个查看attempts次数,一个增加attempts次数(当然release还有其他操作).那么找找谁调用了release方法(看下面的trycatch,就是在出现异常之后并且job没有被删除的情况下会调用release)?如果没有抛出异常?那么attempts是不会变化的。
return $this->logFailedJob($connection, $job);
}
try{
$job->fire();// job的fire方法实际已经将我们指定的JobClass用Container::make并且执行了fire方法.
if ($job->autoDelete()) $job->delete();
return ['job' => $job, 'failed' => false];
} catch (\Exception $e){
if ( ! $job->isDeleted()) $job->release($delay);
throw $e;
}
}
恩,差不多就是这么回事了。
你那个抛出来的Swift_TransportException
是发送邮件程序swiftmailer
fire
yang biasa dalam IlluminateQueueConsoleWorkCommand
? Ya itu sahaja. Teruskan mengejar,runWork
untuk mencari kerja dan laksanakannya Terdapat pilihan daemon
di sini, menunjukkan sama ada untuk dijalankan sebagai daemon. Secara langsung menganggap daemon sebagai palsu (kerana daemon sebenarnya adalah sementara(benar)):joy:. 🎜
🎜Lihat bahawa runWork
sebenarnya memanggil kaedah IlluminateQueueWorker::pop
🎜
rrreee
🎜Tiba di kedudukan pelaksanaan akhir kerja (memadamkan baris dan komen kosong, kerana saya akan menulis komen bahasa Cina yang buruk. (Escape):🎜
rrreee
🎜Nah, itu sahaja. 🎜
🎜 Swift_TransportException
yang anda lemparkan ialah ralat yang dilemparkan oleh program penghantaran e-mel swiftmailer
🎜phpcn_u15822017-05-16 16:58:46
Dalam konfigurasi sambungan dalam config/queue.php, sync, beanstalkd, sqs, dll. ialah nama sambungan.