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