Laravel 个正在处理但未执行任何操作的作业
Laravel jobs being processed but not doing anything
我已经检查了关于这个问题的多个答案,但似乎没有合适的解决方案。我正在解雇一份工作,它在 sync
模式下运行良好,但在 database
驱动程序下根本无法工作。
queue.php
'default' => env('QUEUE_CONNECTION', 'sync'),
.env
QUEUE_DRIVER=database
我是如何解雇这份工作的。我尝试删除 onConnection('database')
但它会在 sync
驱动程序上 运行 而不是
SendNotifications::dispatch(array("message" => "test"))->onConnection('database');
我正在执行以下命令来监听
php artisan queue:work database
当我解雇工作时,它被写入 jobs
table,几秒钟后,它变成 processed
。问题是:它没有开火。如果我删除 onConnection('database')
它可以在 sync
模式下正常工作。
class SendNotifications implements ShouldQueue {
public function __construct(){
}
public function handle(){
// here i'm connecting to a notifications api
}
}
里面的例子handle()
if($this->event_name === "example"){
$room = $this->getRoomByID($example_id_variable); // database_call
if(empty($room) === true) {
return;
}
$notify_receivers = getBlabla(); //get the receivers from the database (complex query)
if(empty($notify_receivers) === false){
foreach($notify_receivers as $receiver){
$this->sendMessageAPI($receiver, $this->payload);
}
}
}
sentMessageAPI
public function sendMessageAPI($id, $payload) {
$curl = curl_init();
$post_fields = array(
"key" => "key",
"secret" => "secret",
"channelId" => $id,
"message" => $payload
);
curl_setopt_array($curl, array(
CURLOPT_URL => "https://www.piesocket.com/api/publish",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($post_fields),
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
}
我正在 运行 使用 xampp 在本地主机上使用它。任何想法为什么它实际上没有开火?我检查了数据库 table jobs
中的 payload
列,它是正确的。
首先,您需要在 .env
文件中使用 QUEUE_CONNECTION
而不是 QUEUE_DRIVER
。这应该消除对 onConnection('database')
的需要,并将数据库设为默认值。如果你想强制单个作业运行同步,你可以使用dispatch_now
.
你能详细解释一下“不开火”吗?你说它在几秒钟后得到处理,那么这个工作是根本没有被接受还是没有按预期运行?这份工作是否进入 failed_jobs
table?
另一个需要注意的重要事项是,如果您在您的示例中更改 SendNotifications
作业 class,则 必须 重新启动队列工作程序。工人不一定要重新阅读 class,可能使用的是旧的或不正确的 class。对于本地测试,我建议使用 queue:listen
或探索 --once
参数。 https://laravel.com/docs/8.x/queues#the-queue-work-command
我已经检查了关于这个问题的多个答案,但似乎没有合适的解决方案。我正在解雇一份工作,它在 sync
模式下运行良好,但在 database
驱动程序下根本无法工作。
queue.php
'default' => env('QUEUE_CONNECTION', 'sync'),
.env
QUEUE_DRIVER=database
我是如何解雇这份工作的。我尝试删除 onConnection('database')
但它会在 sync
驱动程序上 运行 而不是
SendNotifications::dispatch(array("message" => "test"))->onConnection('database');
我正在执行以下命令来监听
php artisan queue:work database
当我解雇工作时,它被写入 jobs
table,几秒钟后,它变成 processed
。问题是:它没有开火。如果我删除 onConnection('database')
它可以在 sync
模式下正常工作。
class SendNotifications implements ShouldQueue {
public function __construct(){
}
public function handle(){
// here i'm connecting to a notifications api
}
}
里面的例子handle()
if($this->event_name === "example"){
$room = $this->getRoomByID($example_id_variable); // database_call
if(empty($room) === true) {
return;
}
$notify_receivers = getBlabla(); //get the receivers from the database (complex query)
if(empty($notify_receivers) === false){
foreach($notify_receivers as $receiver){
$this->sendMessageAPI($receiver, $this->payload);
}
}
}
sentMessageAPI
public function sendMessageAPI($id, $payload) {
$curl = curl_init();
$post_fields = array(
"key" => "key",
"secret" => "secret",
"channelId" => $id,
"message" => $payload
);
curl_setopt_array($curl, array(
CURLOPT_URL => "https://www.piesocket.com/api/publish",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($post_fields),
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
}
我正在 运行 使用 xampp 在本地主机上使用它。任何想法为什么它实际上没有开火?我检查了数据库 table jobs
中的 payload
列,它是正确的。
首先,您需要在 .env
文件中使用 QUEUE_CONNECTION
而不是 QUEUE_DRIVER
。这应该消除对 onConnection('database')
的需要,并将数据库设为默认值。如果你想强制单个作业运行同步,你可以使用dispatch_now
.
你能详细解释一下“不开火”吗?你说它在几秒钟后得到处理,那么这个工作是根本没有被接受还是没有按预期运行?这份工作是否进入 failed_jobs
table?
另一个需要注意的重要事项是,如果您在您的示例中更改 SendNotifications
作业 class,则 必须 重新启动队列工作程序。工人不一定要重新阅读 class,可能使用的是旧的或不正确的 class。对于本地测试,我建议使用 queue:listen
或探索 --once
参数。 https://laravel.com/docs/8.x/queues#the-queue-work-command