当前位置: 首页 > 知识库问答 >
问题:

thinkphp6 安装了think-queue和redis 为什么任务没有延迟20秒执行?

公西飞鸾
2023-11-30

thinkphp6 安装了think-queue和redis
生产者Queue::later 20秒执行,
消费者 执行任务
执行:/www/server/php/72/bin/php think queue:work --queue Money > /www/wwwroot/log.txt

访问生产者。

queue.php

<?phpreturn [    'default' => 'redis',    'connections' => [        'sync' => [            'driver' => 'sync',        ],        'database' => [            'driver' => 'database',            'queue' => 'default',            'table' => 'jobs',        ],        'redis' => [            'driver' => 'redis',            'queue' => 'default',            'host' => '127.0.0.1',            'port' => 6379,            'password' => '',            'select' => 1,            'timeout' => 0,            'persistent' => false,        ],    ],    'failed' => [        'type' => 'none',        'table' => 'failed_jobs',    ],];

生产者代码:

 $jobHandlerClassName = 'app\queue\job\Money';            $jobDataArr = ['submit' => time()];            $jobQueueName = "money";                        // $isPushed=Queue::push($jobHandlerClassName, $jobDataArr, $jobQueueName);            $isPushed=Queue::later(20,$jobHandlerClassName, $jobDataArr, $jobQueueName);            echo '===';            echo '<br>';            echo $isPushed;            echo '<br>';            if( $isPushed !== false ){                echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";            }else{              echo 'Oops, something went wrong.';            }

消费者:

    public function fire(Job $job, $data)    {        Db::name('text')->insert(['content'=>'fire','create_time'=>time()]);        // job        $isJobDone = $this->doJob($job, $data);        $attempts = $job->attempts() + 1;        if ($isJobDone) {            print('<info>[' . date('Y-m-d H:i:s', time()) . ""  . "任务完成</info>\n");            $job->delete();        } else {            $release = strtotime(date('Y-m-d H:', time()) . '00') + 3599 + date('i', $data['submit']) * 60 + date('s', $data['submit']) - time();            print('<info>[' . date('Y-m-d H:i:s', time()) . "] " . $release . "秒后执行主机" . $data['host_name'] . "第" . $attempts . "次扣费任务</info>\n");            $job->release($release);        }    }    /**     * @throws DataNotFoundException     * @throws ModelNotFoundException     * @throws DbException     * @throws Exception     */    private function doJob($job, $data): bool    {            print("<info>Hello Job has been done and deleted"."</info>\n");        Db::name('text')->insert(['content'=>'doJob','create_time'=>time()]);                // 返回        return true;    }

我想要的是异步执行,20秒后执行doJob业务逻辑 插入数据
但是同步执行了

/www/server/php/72/bin/php think queue:work --queue Money > /www/wwwroot/log.txt

共有1个答案

宋俊艾
2023-11-30

根据您提供的信息,问题可能在于您的队列工作器没有正确运行。在ThinkPHP 6中,您需要确保队列工作器正在运行,并且它正在监听所需的队列。

您可以尝试以下步骤来解决您的问题:

  1. 确保Redis服务器正在运行,并且可以从您的应用程序访问。您可以在配置文件中检查Redis连接信息是否正确。
  2. 确保ThinkPHP 6的队列驱动程序已正确配置。在队列配置文件(例如queue.php)中,您需要确保已正确配置所需的队列连接信息。对于Redis连接,您需要确保主机和端口正确无误,并且Redis服务器正在运行。
  3. 确保您的队列工作器正在运行。您可以通过运行以下命令来启动队列工作器:
/www/server/php/72/bin/php think queue:work --queue Money

该命令将启动一个工作进程,它将监听指定的队列并执行队列中的任务。

  1. 如果您的队列工作器正在运行但问题仍然存在,请确保您的任务处理器类(Money)具有正确的命名空间和类定义,并且可以在应用程序中正确加载。
  2. 检查日志文件以查看是否有任何错误或异常。在您的代码中,您可以使用Log类将调试信息写入日志文件,以便更好地了解问题所在。

请注意,以上步骤仅提供了一些常见的故障排除步骤。要获得更具体的帮助,您可能需要提供更多关于您的应用程序和配置的详细信息。

 类似资料:
  • 我已经通过运行以下命令在CentOS 7上安装了docker, 注意:helloworld运行正常,没有问题。 但是,当我尝试运行(docker-compose.yml存在且有效)时,它只给我CentOS上的错误(Windows版本适用于docker-composefile)

  • 我通过运行以下命令在CentOS 7上安装了docker, 注意:helloworld运行正常,没有问题。 但是,当我尝试运行(docker-compose.yml存在且有效)时,它仅在CentOS上给出错误(Windows版本适用于docker compose文件)

  • 问题内容: 我试图在收到请求后立即发送页面响应,然后进行处理,但是我发现响应即使按代码顺序排列也没有“首先”发送。在现实生活中,我有一个页面可供上传一个Excel工作表,该工作表保存到数据库中需要花费时间(50000+行),并且希望更新用户进度。这是一个简化的示例;(取决于您有多少RAM,您可能需要添加几个零来计数才能看到结果) 问题答案: HTTP协议的原始概念是一个简单的请求- 响应服务器-客

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感

  • 问题内容: 我正在使用该工具观察Redis服务器的延迟。这是一个例子: 问题是,这些值实际上意味着什么?我正在努力寻找有关此工具的文档,而该文档无法通过该工具自己的帮助文档获得。 问题答案: 该命令是一个工具,可以帮助您解决和了解Redis可能遇到的延迟问题。通过测量Redis服务器响应Redis PING命令的时间(以毫秒为单位)来实现。 在这种情况下,延迟是客户端发出命令的时间与客户端收到对命

  • 问题内容: 有什么技巧可以基于Redis延迟任务执行(即计划)? 也许一些聪明的方法可以将BLPOP延迟给定的秒数? 问题答案: 您可以使用名称中带有时间成分的多个LIST环。作为时间成分,您可以采用当前秒(0-59)。 您总是将任务添加到当前秒的列表中。要获得作业,请仅在保证内容早于给定秒数的那些列表上执行BLPOP(低超时)。 如果您在多个主机上工作,则必须注意时钟是同步的(NTP)。