WordPress.org

Make WordPress Core

Ticket #7068: 7068_cron_part2.diff

File 7068_cron_part2.diff, 2.8 KB (added by hailin, 10 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?>