首页 > web > wordpress 计划任务机制

wordpress 计划任务机制

Nov 15th,2011 发表评论

wordpress的计划任务通过页面触发实现,只有页面被访问的时候,才判断当时是否有需要运行的后台任务,虽然后台任务是被用户的访问激活的,但后台任务的执行并不会影响用户的访问速度,因为Wordpress在处理用户请求时,发起一个独立的http请求到wp-cron.php页面后,并不等待wp-cron.php将后台任务执行完毕,也不继续接收由wp-cron.php返回的数据,而是立即处理用户的访问请求,这里有点类似多线程

前台页面触发机制

  1. 执行/wp-settings.php中的钩子sanitize_comment_cookies。
  2. sanitize_comment_cookies调用/wp-includes/cron.php wp_cron。


wp_cron如果发现需要跑的任务就执行spawn_cron()。

function spawn_cron( $local_time = 0 ) {

	if ( !$local_time )
		$local_time = time();

	if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) )
		return;

	$flag = get_transient('doing_cron');

	if ( $flag > $local_time + 10*60 )
		$flag = 0;

	if ( $flag + 60 > $local_time )
		return;

	//sanity check
	$crons = _get_cron_array();
	if ( !is_array($crons) )
		return;

	$keys = array_keys( $crons );
	if ( isset($keys[0]) && $keys[0] > $local_time )
		return;

	if ( defined('ALTERNATE_WP_CRON') && ALTERNATE_WP_CRON ) {
		if ( !empty($_POST) || defined('DOING_AJAX') )
			return;

		set_transient( 'doing_cron', $local_time );

		ob_start();
		wp_redirect( add_query_arg('doing_wp_cron', '', stripslashes($_SERVER['REQUEST_URI'])) );
		echo ' ';

		// flush any buffers and send the headers
		while ( @ob_end_flush() );
		flush();

		WP_DEBUG ? include_once( ABSPATH . 'wp-cron.php' ) : @include_once( ABSPATH . 'wp-cron.php' );
		return;
	}

	set_transient( 'doing_cron', $local_time );

	$cron_url = get_option( 'siteurl' ) . '/wp-cron.php?doing_wp_cron';
	wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) );
}

页面触发是一种不得已的办法,有很多局限,具体哪些大家都知道,如果有权限可以改成cron。如下:

1.禁用WP-Cron很简单,编辑wp-config.php,加入一下一行:

define('DISABLE_WP_CRON', true);

2.然后在你后台系统的crontab文件里,增加下面的内容:

*/15 * * * * YOUR_USER /usr/bin/wget -q --post-data '' http://YOUR_SITE/wp-cron.php?doing_wp_cron -O /dev/null
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: wordpress 计划任务机制