wordpress 计划任务机制
Nov 15th,2011
发表评论
wordpress的计划任务通过页面触发实现,只有页面被访问的时候,才判断当时是否有需要运行的后台任务,虽然后台任务是被用户的访问激活的,但后台任务的执行并不会影响用户的访问速度,因为Wordpress在处理用户请求时,发起一个独立的http请求到wp-cron.php页面后,并不等待wp-cron.php将后台任务执行完毕,也不继续接收由wp-cron.php返回的数据,而是立即处理用户的访问请求,这里有点类似多线程。
前台页面触发机制:
- 执行/wp-settings.php中的钩子sanitize_comment_cookies。
- 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 计划任务机制
评论 (0)
Trackbacks (1)
发表评论
Make a trackback
-
WordPress Cron计划任务的执行机制 | PeeMa.us
2011年11月30日15:47