root/tags/2.3.1/wp-includes/cron.php

Revision 5972, 5.0 kB (checked in by ryan, 1 year ago)

Take port into consideration when spawning cron. Props bchecketts. fixes #4782

  • Property svn:eol-style set to native
Line 
1 <?php
2
3 function wp_schedule_single_event( $timestamp, $hook, $args = array()) {
4     $crons = _get_cron_array();
5     $key = md5(serialize($args));
6     $crons[$timestamp][$hook][$key] = array( 'schedule' => false, 'args' => $args );
7     uksort( $crons, "strnatcasecmp" );
8     _set_cron_array( $crons );
9 }
10
11 function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {
12     $crons = _get_cron_array();
13     $schedules = wp_get_schedules();
14     $key = md5(serialize($args));
15     if ( !isset( $schedules[$recurrence] ) )
16         return false;
17     $crons[$timestamp][$hook][$key] = array( 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
18     uksort( $crons, "strnatcasecmp" );
19     _set_cron_array( $crons );
20 }
21
22 function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array()) {
23     $crons = _get_cron_array();
24     $schedules = wp_get_schedules();
25     $key = md5(serialize($args));
26     $interval = 0;
27
28     // First we try to get it from the schedule
29     if ( 0 == $interval )
30         $interval = $schedules[$recurrence]['interval'];
31     // Now we try to get it from the saved interval in case the schedule disappears
32     if ( 0 == $interval )
33         $interval = $crons[$timestamp][$hook][$key]['interval'];
34     // Now we assume something is wrong and fail to schedule
35     if ( 0 == $interval )
36         return false;
37
38     while ( $timestamp < time() + 1 )
39         $timestamp += $interval;
40
41     wp_schedule_event( $timestamp, $recurrence, $hook, $args );
42 }
43
44 function wp_unschedule_event( $timestamp, $hook, $args = array() ) {
45     $crons = _get_cron_array();
46     $key = md5(serialize($args));
47     unset( $crons[$timestamp][$hook][$key] );
48     if ( empty($crons[$timestamp][$hook]) )
49         unset( $crons[$timestamp][$hook] );
50     if ( empty($crons[$timestamp]) )
51         unset( $crons[$timestamp] );
52     _set_cron_array( $crons );
53 }
54
55 function wp_clear_scheduled_hook( $hook ) {
56     $args = array_slice( func_get_args(), 1 );
57
58     while ( $timestamp = wp_next_scheduled( $hook, $args ) )
59         wp_unschedule_event( $timestamp, $hook, $args );
60 }
61
62 function wp_next_scheduled( $hook, $args = array() ) {
63     $crons = _get_cron_array();
64     $key = md5(serialize($args));
65     if ( empty($crons) )
66         return false;
67     foreach ( $crons as $timestamp => $cron ) {
68         if ( isset( $cron[$hook][$key] ) )
69             return $timestamp;
70     }
71     return false;
72 }
73
74 function spawn_cron() {
75     $crons = _get_cron_array();
76
77     if ( !is_array($crons) )
78         return;
79
80     $keys = array_keys( $crons );
81     if ( array_shift( $keys ) > time() )
82         return;
83
84     $cron_url = get_option( 'siteurl' ) . '/wp-cron.php';
85     $parts = parse_url( $cron_url );
86
87     if ($parts['scheme'] == 'https') {
88         // support for SSL was added in 4.3.0
89         if (version_compare(phpversion(), '4.3.0', '>=') && function_exists('openssl_open')) {
90             $port = isset($parts['port']) ? $parts['port'] : 443;
91             $argyle = @fsockopen('ssl://' . $parts['host'], $port, $errno, $errstr, 0.01);
92         } else {
93             return false;
94         }
95     } else {
96         $port = isset($parts['port']) ? $parts['port'] : 80;
97         $argyle = @ fsockopen( $parts['host'], $port, $errno, $errstr, 0.01 );
98     }
99
100     if ( $argyle )
101         fputs( $argyle,
102               "GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
103             . "Host: {$_SERVER['HTTP_HOST']}\r\n\r\n"
104         );
105 }
106
107 function wp_cron() {
108     // Prevent infinite loops caused by lack of wp-cron.php
109     if ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false )
110         return;
111
112     $crons = _get_cron_array();
113
114     if ( !is_array($crons) )
115         return;
116
117     $keys = array_keys( $crons );
118     if ( isset($keys[0]) && $keys[0] > time() )
119         return;
120
121     $schedules = wp_get_schedules();
122     foreach ( $crons as $timestamp => $cronhooks ) {
123         if ( $timestamp > time() ) break;
124         foreach ( $cronhooks as $hook => $args ) {
125             if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )
126                 continue;
127             spawn_cron();
128             break 2;
129         }
130     }
131 }
132
133 function wp_get_schedules() {
134     $schedules = array(
135         'hourly' => array( 'interval' => 3600, 'display' => __('Once Hourly') ),
136         'daily' => array( 'interval' => 86400, 'display' => __('Once Daily') ),
137     );
138     return array_merge( apply_filters( 'cron_schedules', array() ), $schedules );
139 }
140
141 function wp_get_schedule($hook, $args = array()) {
142     $crons = _get_cron_array();
143     $key = md5(serialize($args));
144     if ( empty($crons) )
145         return false;
146     foreach ( $crons as $timestamp => $cron ) {
147         if ( isset( $cron[$hook][$key] ) )
148             return $cron[$hook][$key]['schedule'];
149     }
150     return false;
151 }
152
153 //
154 // Private functions
155 //
156
157 function _get_cron_array()  {
158     $cron = get_option('cron');
159     if ( ! is_array($cron) )
160         return false;
161
162     if ( !isset($cron['version']) )
163         $cron = _upgrade_cron_array($cron);
164
165     unset($cron['version']);
166
167     return $cron;
168 }
169
170 function _set_cron_array($cron) {
171     $cron['version'] = 2;
172     update_option( 'cron', $cron );
173 }
174
175 function _upgrade_cron_array($cron) {
176     if ( isset($cron['version']) && 2 == $cron['version'])
177         return $cron;
178
179     $new_cron = array();
180
181     foreach ($cron as $timestamp => $hooks) {
182         foreach ( $hooks as $hook => $args ) {
183             $key = md5(serialize($args['args']));
184             $new_cron[$timestamp][$hook][$key] = $args;
185         }
186     }
187
188     $new_cron['version'] = 2;
189     update_option( 'cron', $new_cron );
190     return $new_cron;
191 }
192
193 ?>
194
Note: See TracBrowser for help on using the browser.