WordPress.org

Make WordPress Core

Ticket #7068: 7068_cron_part2.diff

File 7068_cron_part2.diff, 2.8 KB (added by hailin, 6 years ago)

revised patch part2

  • C:/xampp/htdocs/wordpress_trunk/wp-includes/cron.php

     
    7171        return false; 
    7272} 
    7373 
    74 function spawn_cron() { 
     74function spawn_cron( $local_time ) { 
     75        global $current_blog;  
     76         
     77        /*  
     78         * do not even start the cron if local server timer has drifted  
     79         * such as due to power failure, or misconfiguration 
     80         */ 
     81        $timer_accurate = check_server_timer( $local_time );  
     82        if ( !$timer_accurate ) 
     83                return;  
     84                 
     85        //sanity check 
    7586        $crons = _get_cron_array(); 
    76  
    7787        if ( !is_array($crons) ) 
    7888                return; 
    7989 
    8090        $keys = array_keys( $crons ); 
    81         if ( array_shift( $keys ) > time() ) 
     91        $timestamp =  $keys[0];  
     92        if ( $timestamp > $local_time ) 
    8293                return; 
    8394 
     95        /* 
     96         * multiple processes on multiple web servers can run this code concurrently  
     97         * try to make this as atomic as possible by setting doing_cron switch 
     98         */ 
     99         $flag = get_option('doing_cron');  
     100          
     101         // clean up potential invalid value resulted from various system chaos 
     102         if ( $flag != 0 ) {  
     103                if ( $flag > $local_time + 10*60 || $flag < $local_time - 10*60 ) { 
     104                        update_option('doing_cron', 0); 
     105                        $flag = 0;  
     106                } 
     107         } 
     108          
     109         //don't run if another process is currently running it 
     110         if ( $flag > $local_time )  
     111                return;  
     112 
     113         update_option( 'doing_cron', $local_time + 30 ); 
     114          
     115         //proceed to run cron 
    84116        $cron_url = get_option( 'siteurl' ) . '/wp-cron.php'; 
    85117        $parts = parse_url( $cron_url ); 
    86118 
     
    94126                } 
    95127        } else { 
    96128                $port = isset($parts['port']) ? $parts['port'] : 80; 
    97                 $argyle = @ fsockopen( $parts['host'], $port, $errno, $errstr, 0.01 ); 
     129                $argyle = @ fsockopen( $_SERVER['SERVER_ADDR'], $port, $errno, $errstr, 0.01 ); 
    98130        } 
    99131 
    100132        if ( $argyle ) 
     
    105137} 
    106138 
    107139function wp_cron() { 
     140         
    108141        // Prevent infinite loops caused by lack of wp-cron.php 
    109142        if ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false ) 
    110143                return; 
     
    117150        $keys = array_keys( $crons ); 
    118151        if ( isset($keys[0]) && $keys[0] > time() ) 
    119152                return; 
    120  
     153         
     154        $local_time = time();  
    121155        $schedules = wp_get_schedules(); 
    122156        foreach ( $crons as $timestamp => $cronhooks ) { 
    123                 if ( $timestamp > time() ) break; 
     157                if ( $timestamp > $local_time ) break; 
    124158                foreach ( $cronhooks as $hook => $args ) { 
    125159                        if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) ) 
    126160                                continue; 
    127                         spawn_cron(); 
     161                        spawn_cron( $local_time ); 
    128162                        break 2; 
    129163                } 
    130164        } 
     
    190224        return $new_cron; 
    191225} 
    192226 
     227// stub for checking server timer accuracy, using outside standard time sources 
     228function check_server_timer( $local_time ) {  
     229        return true;  
     230} 
     231 
    193232?>