运行cron任务而不妨碍页面加载?

时间:2013-05-22 作者:montrealist

我有一个插件,允许用户在管理区域通过AJAX上传帖子附件。我稍后尝试通过将这些文件推送到DropBoxtheir REST API. 它几乎可以工作。问题是WP cron任务在运行时会阻止页面加载until the push to DropBox finishes (对于较大的文件,这可能需要30分钟)。

我看过类似的问题(herehere), 但后者意味着这些cron任务确实会阻止在任务运行时正确加载页面。

是否可以将其设置为使页面加载不受cron任务执行的影响?也许我做得不对。

以下是我的插件的相关部分:

function __construct() {

    add_action( \'wp_ajax_my_admin_upload_attachment\', array( $this, \'my_admin_upload_attachment\') );
    add_action(\'my_push_to_dropbox\', array($this,\'push_to_dropbox\'));

} // end constructor

function my_admin_upload_attachment() {
    /* upload and save file locally, update post meta */
    /* schedule the files to be uploaded to DropBox */
    wp_schedule_single_event(time()+5, \'my_push_to_dropbox\');
    /* return success JSON */
}

function push_to_dropbox() {
    $this->log(\'push_to_dropbox - started.\');
    //$this->do_push_to_dropbox();
    @ignore_user_abort(true); // this does not help: \'finished\' message still never prints
    set_time_limit(0);
    sleep(30); // this mimicks the long-running upload task
    $this->log(\'push_to_dropbox - finished.\');
}
EDIT: 已删除define(\'ALTERNATE_WP_CRON\', true); 从…起wp-config.php, 现在页面加载没有延迟,但cron任务会被连续的页面刷新中断:上面的“完成”消息不会打印在日志中。

2 个回复
SO网友:Matthew Boynes

除了0.01s超时外,Cron任务不会直接影响页面加载(当然,它们会影响服务器负载,因此它们会间接影响页面加载)。

我的直觉是,PHP配置就是问题所在。cron任务与任何其他web请求一样运行,并且它们受PHP的max_execution_time INI设置。如果这设置为(例如)90秒,则请求将终止,并且您的文件将无法同步。您可以通过设置sleep 比您的max_execution_time, 看看是否结束。

如果是这种情况,您可以尝试添加:

ini_set( \'max_execution_time\', 0 );
到您的顶部push_to_dropbox() 作用这不是一个很好的解决方案,因为它不会在每台主机上都工作,但这只是一个开始。

SO网友:Justin Waulters

根据WP Plugin Handbook “计划运行的任何任务都将在该页面加载期间运行。”因此,它总是会降低页面加载速度,并且不应用于直接替换实际的CRON(或计划任务),以执行用户不必等待的大型任务。

一个更好的解决方案是设置一个WP Cron任务来启动一个异步任务,该任务将在后台完成工作-最容易使用库完成,例如this one. 这样,用户就不必等待进程完成,如果用户断开连接,进程也不会被终止。

或者,可以使用如下服务AWS LambdaCronJob.org 启动流程。

结束

相关推荐

URL中的“do_wp_cron”,即使备用Cron不在wp-config中

插入?doing_wp_cron Wordpress的URL有很好的文档记录here.我的问题有点不同。我打开了ALTERNATE_WP_CRON my中的功能wp-config 几天前存档。然后,注意到这个问题,即引入?doing_wp_cron 在我的URL中–我禁用了它。我说的“残疾”是指我把它从wp-config 文件我36小时前做的。我的问题是?doing_wp_cron 仍显示在我的访问日志中。我想知道为什么?我的两个假设是:1) 我不应该删除ALTERNATE_WP_CRON 但我应该给它价