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
根据您提供的信息,问题可能在于您的队列工作器没有正确运行。在ThinkPHP 6中,您需要确保队列工作器正在运行,并且它正在监听所需的队列。
您可以尝试以下步骤来解决您的问题:
queue.php
)中,您需要确保已正确配置所需的队列连接信息。对于Redis连接,您需要确保主机和端口正确无误,并且Redis服务器正在运行。/www/server/php/72/bin/php think queue:work --queue Money
该命令将启动一个工作进程,它将监听指定的队列并执行队列中的任务。
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)。