[wp-trac] [WordPress Trac] #19818: ALTERNATE_WP_CRON causes some cron tasks to fail

WordPress Trac wp-trac at lists.automattic.com
Thu Jan 12 21:00:51 UTC 2012


#19818: ALTERNATE_WP_CRON causes some cron tasks to fail
-----------------------------+-----------------------------
 Reporter:  norocketsurgeon  |      Owner:
     Type:  defect (bug)     |     Status:  new
 Priority:  normal           |  Milestone:  Awaiting Review
Component:  Cron             |    Version:  3.3.1
 Severity:  normal           |   Keywords:
-----------------------------+-----------------------------
 If ALTERNATE_WP_CRON is defined as true and a task run by it requires
 certain global variables the task will fail.  I have traced this issue to
 a difference in the execution flow between a normal cron call and an
 ALTERNATE_WP_CRON call.  Normal cron calls actually wait for the entire
 execution flow of require_once('./wp-load.php'); to complete before
 processing tasks.  ALTERNATE_WP_CRON calls result in the execution of the
 tasks on the action 'sanitize_comment_cookies' which means some globals
 that may be required are not defined yet.  Below is a general outline of
 the execution flow of the two different types of cron calls.

 Normal Cron:
 * 'sanitize_comment_cookies' triggers wp_cron()
 * wp_cron calls spawn_cron()
 * spawn_cron() makes remote post to wp-cron.php on same site
 * wp-cron.php defines 'DOING_CRON'
 * wp-cron.php calls require_once('./wp-load.php');
 * wp-settings.php fires action 'sanitize_comment_cookies'
 * 'sanitize_comment_cookies' triggers wp_cron()
 * wp_cron() calls spawn_cron()
 * spawn_cron() detects 'DOING_CRON' defined and returns
 * the rest of wp-load.php execution finishes resulting in all globals
 defined
 * '''wp-cron.php executes tasks'''

 ALTERNATE_WP_CRON:
 * 'sanitize_comment_cookies' triggers wp_cron()
 * wp_cron calls spawn_cron()
 * spawn_cron() requre_once's wp-cron.php
 * wp-cron.php defines 'DOING_CRON'
 * '''wp-cron.php executes tasks before all globals are ready'''

 I noticed this problem because ping processing requires the global
 wp_rewrite to be defined in some cases and since this is defined after the
 'sanatize_comment_cookies' action is fired, pings to sites with fancy
 permalink structures will fail.  This failure occurs in the call to
 url_to_postid() in the pingback() function in wp-inclues/comment.php.
 url_to_postid() attempts to process the pingback link and in cases where
 there are no post parameters requires $wp_rewrite to be defined.

 How to reproduce:
 * define ALTERNATE_WP_CRON to true
 * configure site to send and receive pings and trackbacks
 * create a post with a link to a blog that uses pretty permalinks
 (http://example.com/example/ would cause the failure but
 http://example.com/?p=1 would not)
 * publish post
 * no ping will be sent

 My idea for a solution would be to put cron task execution inside a
 function called on the 'wp_loaded' action to ensure everything is setup
 before running the tasks.  I would be willing to implement this if someone
 more experienced / knowledgeable about cron thinks that this is
 appropriate.

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/19818>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list