Php Cron作业-如何防止发送重复通知?

Php Cron作业-如何防止发送重复通知?,php,cron,scheduled-tasks,Php,Cron,Scheduled Tasks,我试图在一小时内某个事件即将发生时发送通知 出于测试目的,我目前让cron进程每分钟运行一次。但我怀疑有一种更有效的方法来解决这个问题 我试图避免跟踪通知,因此我试图构建一些逻辑,以便在通知上获得一个触发器 以下是我当前的流程: function webinar_starts_onehour() { // Get all lessons that are in future $today = time(); $args = array( 'post_ty

我试图在一小时内某个事件即将发生时发送通知

出于测试目的,我目前让cron进程每分钟运行一次。但我怀疑有一种更有效的方法来解决这个问题

我试图避免跟踪通知,因此我试图构建一些逻辑,以便在通知上获得一个触发器

以下是我当前的流程:

function webinar_starts_onehour() {

    // Get all lessons that are in future
    $today = time();
    $args = array(
        'post_type'   => 'lessons',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'meta_query' => array(
                                'key' => 'webinar_time',
                                'value' => $today,
                                'compare' => '>='
                             )
    );
    $lessons = get_posts( $args );

    $notifications = get_notifications( 'webinar_starts_onehour' );

    // Foreach lesson
    foreach ( $lessons as $lesson ) {

        $webinar_time = strtotime($lesson->webinar_time);
        $difference = round(($webinar_time - $today) / 3600,2);

        if (($difference > .98) && ($difference < 1.017)) {
           // do something
        }
    }
}
功能网络研讨会\u开始\u一小时(){
//获得未来的所有课程
$today=时间();
$args=数组(
“post_type”=>“课程”,
“发布状态”=>“发布”,
“每页帖子数”=>-1,
“元查询”=>数组(
“关键”=>“网络研讨会时间”,
“价值”=>今天的美元,
'比较'=>'>='
)
);
$lessons=get_posts($args);
$notifications=get_notifications('webinar_启动一小时');
//每节课
foreach($lessons作为$lesson){
$webinar\u time=strottime($lesson->webinar\u time);
$difference=round($webinar_time-$today)/3600,2);
如果(($difference>0.98)和($difference<1.017)){
//做点什么
}
}
}
所以我想做的是,如果距离它不到一个小时或多一点(也就是+-一分钟),就触发它

我怀疑我的条件在某些情况下可以设置两次,因此我试图找到一种更可靠的方法来确保使用每分钟触发一次的cron,该条件只会触发一次

想法

如果您认为这真的不可靠(我知道这是不可靠的),那么添加一个表来跟踪此类通知的实用方法是什么?我是否可以创建一个表,比如说,
sent\u notifications
,它将具有
用户id
通知id
课程id
状态
然后检查是否有此特定课程的成功通知,对于失败的发送,是否使用另一个cron继续尝试发送失败的通知

谢谢,
Brian

例如,您可以使用redis或memcached。存储通知及其发送到的用户。设置过期时间。过期后,密钥不再存在,您可以再次发送。我认为带有通知的表方法对于日志记录和消息失败时重试来说是更好的方法。防止另一个作业运行和发送重复消息的简单方法可以基于时间戳。我想,当你开始发送通知时,你是批量发送的。因此,foreach循环只需运行一次。您可以做的是创建一个文件,如notifications.lock,在启动时带有时间戳,然后在完成后将其删除。这样可以防止重复运行。希望有帮助!