Php 如何每10分钟交错循环一次
问题摘要 我有一个每小时运行的命令。它循环遍历6个项目的数组,并将数据发布到twitter。问题是它一次将所有6个项目发布到twitter上。我希望循环的每个元素每10分钟交错一次。这样,twitter追随者就不会每小时收到我们的推文 我尝试过的 我做了一个不那么优雅的解决方案。只需添加Php 如何每10分钟交错循环一次,php,laravel,laravel-5,Php,Laravel,Laravel 5,问题摘要 我有一个每小时运行的命令。它循环遍历6个项目的数组,并将数据发布到twitter。问题是它一次将所有6个项目发布到twitter上。我希望循环的每个元素每10分钟交错一次。这样,twitter追随者就不会每小时收到我们的推文 我尝试过的 我做了一个不那么优雅的解决方案。只需添加sleep(600)到循环 foreach ($parks as $park) { Twitter::post(...); sleep(600); } 这很好,但我觉得有一个比让这个过程运行一小
sleep(600)代码>到循环
foreach ($parks as $park) {
Twitter::post(...);
sleep(600);
}
这很好,但我觉得有一个比让这个过程运行一小时更好的方法。我会使用一个作业,并将其延迟排队。例如:
<?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
}
}
在这种情况下,每个作业将延迟10分钟 我会使用一个作业并将其延迟排队。例如:
<?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
}
}
在这种情况下,每个作业将延迟10分钟 如果您有一个队列系统,我建议使用而不是cronjob。您还可以有一个每小时调度一次的cronjob,用于调度其中六个调度队列作业
如果您喜欢使用当前系统,您可以使用date('i')
获取当前的小时分钟数。然后,您可以将分钟数除以10,并将结果四舍五入到地板上。它将为数组留下一个介于0和5之间的索引:
$minutes = (int) date('i');
$index = floor($minutes / 10);
$park = $parks[$index];
有了这个逻辑,您可以简单地将当前作业安排为每十分钟运行一次,而不是每小时运行一次
注意:为了安全起见,您可能需要检查$index
是否在数组的范围内。如果您有队列系统,我建议使用而不是cronjob。您还可以有一个每小时调度一次的cronjob,用于调度其中六个调度队列作业
如果您喜欢使用当前系统,您可以使用date('i')
获取当前的小时分钟数。然后,您可以将分钟数除以10,并将结果四舍五入到地板上。它将为数组留下一个介于0和5之间的索引:
$minutes = (int) date('i');
$index = floor($minutes / 10);
$park = $parks[$index];
有了这个逻辑,您可以简单地将当前作业安排为每十分钟运行一次,而不是每小时运行一次
注意:为了安全起见,您可能需要检查$index
是否在您的数组范围内。所以作业只需处理twitter帖子,我只需传递公园信息<代码>推特::帖子(…)代码>这样每个推特帖子都会延迟?是的。在我的特殊情况下,延迟设置为1分钟,但您可以更改它。请记住,像SQS这样的队列的最大延迟时间为15分钟。您可能指的是延迟(现在()->addMinutes($key*10))
,但这是一个很好的例子。@Mozammil因为他希望他的六篇文章在一个小时内分布。他不想让他们在五分钟内发布是的@fyroc,我猜他不知道你的模型叫什么。你的代码没有显示出来。所以工作只是处理推特帖子,而我只是传递公园信息<代码>推特::帖子(…)代码>这样每个推特帖子都会延迟?是的。在我的特殊情况下,延迟设置为1分钟,但您可以更改它。请记住,像SQS这样的队列的最大延迟时间为15分钟。您可能指的是延迟(现在()->addMinutes($key*10))
,但这是一个很好的例子。@Mozammil因为他希望他的六篇文章在一个小时内分布。他不想让他们在五分钟内发布是的@fyroc,我猜他不知道你的模型叫什么。你的代码没有显示它。