首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何每10分钟错开一圈?

如何每10分钟错开一圈?
EN

Stack Overflow用户
提问于 2019-01-04 16:24:54
回答 2查看 367关注 0票数 0

问题综述

我有一个命令,我每小时运行一次。它遍历并排列了6个条目,并将数据发布到twitter。问题是,它同时将所有6个项目发布到twitter上。我希望循环中的每一个元素每10分钟交错一次。这样,twitter的追随者们就不会每小时都收到我们的推文。

我试过什么

我确实做了一个不那么优雅的解决方案。简单地将sleep(600);添加到循环中。

代码语言:javascript
复制
foreach ($parks as $park) {
    Twitter::post(...);
    sleep(600);
}

这很好,但我觉得有比让这个过程活一个小时更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 16:36:24

我会使用作业,并延迟排队。例如:

代码语言:javascript
复制
<?php

namespace App\Jobs;

use App\Park;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class PostToTwitter implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
    * The tweet
    *
    * @var App\Park
    */
    public $park;

    /**
    * Create a new job instance.
    *
    * @return void
    */
    public function __construct(Park $park)
    {
        $this->park = $park;
    }

    /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
    {
        // handles posting to twitter
    }
}

..。然后排好队。

代码语言:javascript
复制
foreach ($parks as $key => $park) {
    $job = (new PostToTwitter($park))
        ->delay(now()->addMinutes($key * 10));

    dispatch($job);
}

在这种情况下,每项工作都会延迟10分钟。

票数 4
EN

Stack Overflow用户

发布于 2019-01-04 16:41:05

如果您有一个队列系统,我建议您使用延迟调度而不是cronjob。您还可以每小时安排一次调度的cron作业,它会分派其中6个计划队列作业。

如果您更喜欢使用当前系统,则可以使用date('i')获取当前小时分钟。然后,您可以将分钟除以10,然后将结果整到地板上。它将为0到5之间的数组留下一个索引:

代码语言:javascript
复制
$minutes = (int) date('i');
$index = floor($minutes / 10);

$park = $parks[$index];

有了这个逻辑,您可以简单地将当前任务安排为每10分钟运行一次,而不是每小时运行一次。

注意:为了安全起见,您可能需要检查$index是否在数组的范围内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54042679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档